$ 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

Alejo Ribes
źródło
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.

Mihai Alexandru-Ionut
źródło
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.');
});
Ian Poston Framer
źródło
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.

Wazzie
źródło