$ http.get (…) .success nie jest funkcją


109

mam ten kod:

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

W moim lokalnym środowisku działa dobrze, ale na serwerze zwróć ten błąd:

TypeError: $ http.get (...). Sukces nie jest funkcją

Jakieś pomysły? Dzięki


1
jaka wersja w lokalnym środowisku envm i na serwerze? btw, $ http.get powrócić HttpPromise, więc trzeba użyć wtedy zamiast
Grundy

czy sprawdziłeś, że wszystkie twoje javascripts ładują się w środowisku serwera?
bansi

7
to then()niesuccess()
Patrick Evans

10
.successSkładnia była prawidłowa do Kątowymi v1.4.3. Zobacz stare dokumenty tutaj: code.angularjs.org/1.4.3/docs/api/ng/service/$http
Mihai MATEI

5
i oficjalnie usunięte w wersji 1.6
adamdport

Odpowiedzi:


213

Plik .successSkładnia była prawidłowa do Kątowymi v1.4.3.

W przypadku wersji do Angular v.1.6 musisz użyć thenmetody. then()Metoda przyjmuje dwa argumenty: a successoraz errorwywołania zwrotnego, która zostanie wywołana z obiektu odpowiedzi.

Korzystając z then()metody, dołącz callbackfunkcję do zwracanej promise.

Coś takiego:

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

   },function (error){

   });
}

Zobacz odniesienie tutaj.

Shortcut dostępne są również metody.

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

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

Oczekuje się, że dane otrzymane z odpowiedzi będą w JSONformacie. JSON to świetny sposób na transport danych i jest łatwy w użyciu w AngularJS

Główną różnicą między 2 jest to, że .then()wywołanie zwraca a promise(rozwiązane z wartością zwróconą z a callback), podczas gdy .success()jest bardziej tradycyjnym sposobem rejestracji callbacksi nie zwraca a promise.


Próbowałem z. Potem i działa dobrze, dzięki Alexandru-Ionut Mihai
Alejo Ribes

1
.successi .thenweź inny parametr, weź pod uwagę to
Max Koretskyi

Jeśli przepisujesz istniejący kod, może być łatwo przedstawić w jednej linii dwie funkcje-argumenty (sukces, błąd), a nie oddzielnie, jak w przykładzie.
Tony Sepia

"$ zasób (...). get (...). to nie jest funkcją" ... Dlaczego angularJS jest taki kiepski, jeśli chodzi o spójność?
Hobbamok

9

Może to być zbędne, ale powyższa odpowiedź, .then(function (success)która jest najczęściej głosowana, mówi, że nie działało to dla mnie od wersji Angular 1.5.8. Zamiast tego użyj responsenastępnie wewnątrz bloku, aby response.datauzyskać moje dane json, których szukałem.

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

to znaczy ... próbowałeś success.data? nazwa parametru nie jest tak ważna w tym przypadku.
Kevin B

Mój kod działa. Kiedy zastosowałem się do powyższej odpowiedzi, utknąłem. Jest to również odpowiedź ze sposobem na faktyczne pobranie danych i zarejestrowanie ich na konsoli. Może to pokazać programistom, jak przetestować swoje dane w przeglądarce. Doprowadził mnie tutaj dokładnie ten sam błąd w nagłówku pytania.
Ian Poston Framer

stary kod $http.get('data/data.json').success(function(data) { data = data;}z moją odpowiedzią programista wie teraz, że data.datanie może sam uzyskać danych. stąd moja odpowiedź jest ważna dla tego komunikatu o błędzie.
Ian Poston Framer

Nazwa zmiennej nie będzie żadnej różnicy, może to być success.dataalbo response.dataczy cokolwiek innego. Możesz nawet użyć, donaldTrump.dataże to też zadziała. Chociaż powinieneś używać rozsądnych nazw zmiennych, nie jestem pewien, czy ta będzie miała sens.
Gaurav Arya

Dzieje się tak, ponieważ obiekt sukcesu ma tablicę o nazwie, dataktóra przechowuje dane przychodzące w odpowiedzi z serwera. musisz uzyskać dostęp do tej tablicy danych, używając <yourSuccessObjectName>.data
Gaurav Arya

4

Jeśli próbujesz używać AngularJs 1.6.6 od 21/10/2017, następujący parametr działa jak .success i został wyczerpany. Metoda .then () przyjmuje dwa argumenty: odpowiedź i wywołanie zwrotne błędu, które zostanie wywołane z obiektem odpowiedzi.

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

Powyższy fragment działa dla strony logowania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.