$ 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");
        });

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

Wazzie
источник