$ http.get (…) .success не является функцией


109

у меня есть этот код:

app.controller('MainCtrl', function ($scope, $http){
  $http.get('api/url-api')
    .success(function (data, status, headers, config){
     }
}

В моей локальной среде работает нормально, но на сервере верните эту ошибку:

TypeError: $ http.get (...). Успех - это не функция

Любые идеи? Спасибо


1
какая версия на локальном envm и на сервере? Кстати, $ http.get вернуться HttpPromise, так что вам нужно использовать то вместо
— Гранди

Вы проверили, что все ваши javascripts загружаются в серверную среду?
— bansi

7
это then()не такsuccess()
— Патрик Эванс

10
.successСинтаксис был правилен до углового v1.4.3. См. Старые документы здесь: code.angularjs.org/1.4.3/docs/api/ng/service/$http
— Mihai MATEI

5
и официально удален в версии 1.6
— adamdport

Ответы:


213

.successСинтаксис был правилен до углового v1.4.3.

Для версий до Angular v.1.6 необходимо использовать thenметод. then()Метод принимает два аргумента: successи в функцию errorобратного вызова , которая будет вызываться с объектом ответа.

Используя then()метод, прикрепите callbackфункцию к возвращаемому promise.

Что-то вроде этого:

app.controller('MainCtrl', function ($scope, $http){
   $http({
      method: 'GET',
      url: 'api/url-api'
   }).then(function (response){

   },function (error){

   });
}

См. Ссылку здесь.

Shortcut также доступны методы.

$http.get('api/url-api').then(successCallback, errorCallback);

function successCallback(response){
    //success code
}
function errorCallback(error){
    //error code
}

Ожидается, что данные, которые вы получите из ответа, будут в JSONформате. JSON - отличный способ передачи данных , и его легко использовать в AngularJS.

Основное различие между 2 состоит в том, что .then()вызов возвращает promise(разрешается значением, возвращаемым из a callback), тогда как .success()это более традиционный способ регистрации callbacksи не возвращает promise.


Я пробовал с .then и работает нормально, спасибо Александру-Ионут Михай
— Алехо Рибес

1
.successи .thenвозьмите другой параметр с учетом этого
— Макс Корецкий

Если переписать существующий код, можно будет легко представить две функции-аргументы (успех, ошибка), упомянутые выше, в строке, а не отдельно, как в примере.
— Tony Sepia

"$ resource (...). get (...). then is not a function" ... Почему angularJS такой хреновый, когда дело касается согласованности?
— Hobbamok

9

Это может быть избыточным, но в приведенном выше ответе, получившем наибольшее количество голосов, говорится, .then(function (success)что это не сработало для меня с версии Angular 1.5.8. Вместо этого используйте responsethen внутри блока, response.dataи я получил мои данные json, которые я искал.

$http({
    method: 'get', 
    url: 'data/data.json'
}).then(function (response) {
    console.log(response, 'res');
    data = response.data;
},function (error){
    console.log(error, 'can not get data.');
});

я имею в виду ... ты пробовал success.data? имя параметра в данном случае не так важно.
— Kevin B

Мой код работает. Когда я последовал приведенному выше ответу, я застрял. Это также ответ, позволяющий получить данные и записать их на консоль. Это может показать разработчикам, как тестировать свои данные в браузере. Меня привела сюда та же самая ошибка в заголовке вопроса.
— Ян Постон Фреймер

старый код $http.get('data/data.json').success(function(data) { data = data;}с моим ответом разработчик теперь знает, что он data.dataне может просто получить данные сам по себе. поэтому мой ответ важен для этого сообщения об ошибке.
— Ян Постон Фреймер

Имя переменной не будет никакой разницы, это может быть success.dataили response.dataили что - нибудь еще. Вы даже можете использовать donaldTrump.dataэто тоже. Хотя вам следует использовать разумные имена переменных, не уверен, что это будет иметь смысл.
— Gaurav Arya

Это связано с тем, что объект успеха имеет именованный массив data, содержащий данные, поступающие в качестве ответа от вашего сервера. вам необходимо получить доступ к этому массиву данных, используя <yourSuccessObjectName>.data
— Gaurav Arya

4

Если вы пытаетесь использовать AngularJs 1.6.6 по состоянию на 21.10.2017, следующий параметр работает как .success и был исчерпан. Метод .then () принимает два аргумента: ответ и обратный вызов ошибки, который будет вызываться с объектом ответа.

 $scope.login = function () {
        $scope.btntext = "Please wait...!";
        $http({
            method: "POST",
            url: '/Home/userlogin', // link UserLogin with HomeController 
            data: $scope.user
         }).then(function (response) {
            console.log("Result value is : " + parseInt(response));
            data = response.data;
            $scope.btntext = 'Login';
            if (data == 1) {
                window.location.href = '/Home/dashboard';
             }
            else {
            alert(data);
        }
        }, function (error) {

        alert("Failed Login");
        });

Приведенный выше снипит работает для страницы входа.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.