$ http.get (…) .success не є функцією


108

у мене є цей код:

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 завантажуються в середовищі сервера?
бансі

7
його then()немаєsuccess()
Патрік Еванс

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

5
і офіційно видалено в v.1.6
admdport

Відповіді:


212

The .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()виклик повертає a promise(вирішується зі значенням, поверненим з a callback), тоді як .success()це більш традиційний спосіб реєстрації callbacksі не повертає a promise.


Я спробував з .then і працює добре, дякую Олександру-Іонут Міхай
Алехо Рібес

1
.successі .thenприйміть різні парами, врахуйте це
Макс Корецький

Якщо перезаписувати існуючий код, можливо, буде легко представити два аргументи-функції (успіх, помилка), згадані вище в рядку, а не окремо, як у прикладі.
Тоні Сепія

"$ Resource (...). get (...). Тоді це не функція" ... Чому angularJS настільки хитрий, коли мова йде про узгодженість?
Хоббамок

8

Це може бути зайвим, але вищезазначена відповідь говорить, .then(function (success)і це не спрацювало для мене як у кутовій версії 1.5.8. Замість використання responseтоді всередині блоку 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? ім'я параметра не так важливо в цьому випадку.
Кевін Б

Мій код працює. Коли я дотримувався вищезгаданої відповіді, я застряг. Це також відповідь із способом насправді отримати дані та записати їх на консоль. Це може показати розробникам, як перевірити свої дані у своєму браузері. Мене сюди привів та сама точна помилка в заголовку запитання.
Ian Poston Framer

старий код $http.get('data/data.json').success(function(data) { data = data;}з моєю відповіддю, розробник тепер знає, що він data.dataне може просто отримати дані самостійно. отже, моя відповідь важлива для цього повідомлення про помилку.
Ian Poston Framer

Ім'я змінної не буде ніякої різниці, це може бути success.dataабо response.dataабо що - небудь ще. Ви навіть можете використати, donaldTrump.dataщо також буде працювати. Хоча ви повинні використовувати розумні імена змінних, не впевнені, що це матиме багато сенсу.
Gaurav Arya

Це відбувається тому, що в об’єкті успіху є масив з іменем, dataякий містить дані, що надходять як відповідь з вашого сервера. вам потрібно отримати доступ до цього масиву даних, скориставшись <yourSuccessObjectName>.data
Gaurav Arya

3

Якщо ви намагаєтесь використовувати 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.