$ 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.