$ http.get (…) .success ist keine Funktion

108

Ich habe diesen Code:

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

Funktioniert in meiner lokalen Umgebung einwandfrei, aber auf einem Server wird der folgende Fehler zurückgegeben:

TypeError: $ http.get (...). Erfolg ist keine Funktion

Irgendwelche Ideen? Vielen Dank

Alejo Ribes
quelle
1
Welche Version auf lokaler Umgebung und auf dem Server? btw, $ http.get HttpPromise zurückkehren, so dass Sie verwenden müssen dann statt
Grundy
Haben Sie überprüft, ob alle Ihre Javascripts in der Serverumgebung geladen sind?
Bansi
7
es ist then()nichtsuccess()
Patrick Evans
10
Die .successSyntax war bis Angular v1.4.3 korrekt. Sehen Sie die alten Dokumente hier: code.angularjs.org/1.4.3/docs/api/ng/service/$http
Mihai MATEI
5
und offiziell entfernt in v.1.6
adamdport

Antworten:

212

Die .successSyntax war bis Angular v1.4.3 korrekt.

Für Versionen bis Angular v.1.6 müssen Sie die thenMethode verwenden. Die then()Methode akzeptiert zwei Argumente: a successund einen errorRückruf, der mit einem Antwortobjekt aufgerufen wird.

Fügen Sie mit der then()Methode eine callbackFunktion an die zurückgegebene Datei hinzu promise.

Etwas wie das:

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

   },function (error){

   });
}

Siehe Referenz hier.

Shortcut Methoden sind ebenfalls verfügbar.

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

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

Es wird erwartet, dass die Daten, die Sie aus der Antwort erhalten, im JSONFormat vorliegen. JSON ist eine großartige Möglichkeit, Daten zu transportieren , und es ist einfach in AngularJS zu verwenden

Der Hauptunterschied zwischen den beiden besteht darin, dass der .then()Aufruf a zurückgibt promise(aufgelöst mit einem von a zurückgegebenen Wert callback), während dies .success()eine traditionellere Art der Registrierung ist callbacksund a nicht zurückgibt promise.

Mihai Alexandru-Ionut
quelle
Ich habe es mit .then versucht und funktioniert einwandfrei, danke Alexandru-Ionut Mihai
Alejo Ribes
1
.successund .thennehmen Sie andere Parameter, berücksichtigen Sie das
Max Koretskyi
Wenn Sie den vorhandenen Code neu schreiben, kann es einfach sein, die beiden oben genannten Argumentfunktionen (Erfolg, Fehler) in Zeile und nicht wie im Beispiel separat darzustellen.
Tony Sepia
"$ resource (...). get (...). dann ist keine Funktion" ... Warum ist angleJS so beschissen, wenn es um Konsistenz geht?
Hobbamok
8

Dies mag überflüssig sein, aber die oben am häufigsten gestimmte Antwort besagt, .then(function (success)dass dies bei mir ab der Angular-Version nicht funktioniert hat 1.5.8. Verwenden Sie stattdessen responsedann innerhalb des Blocks response.datameine json Daten, die ich suchte.

$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
quelle
Ich meine ... hast du es versucht success.data? Der Parametername ist in diesem Fall nicht so wichtig.
Kevin B
Mein Code funktioniert. Als ich der obigen Antwort folgte, blieb ich stecken. Es ist auch eine Antwort mit einer Möglichkeit, die Daten tatsächlich abzurufen und an Ihrer Konsole zu protokollieren. Dies kann Entwicklern zeigen, wie sie ihre Daten in ihrem Browser testen können. Ich wurde hier von genau demselben Fehler in der Überschrift der Frage geführt.
Ian Poston Framer
Alter Code $http.get('data/data.json').success(function(data) { data = data;}mit meiner Antwort Ein Entwickler weiß jetzt, dass er data.datanicht einfach Daten selbst abrufen kann. Daher ist meine Antwort auf diese Fehlermeldung wichtig.
Ian Poston Framer
Der Variablenname macht keinen Unterschied, es könnte sein success.dataoder response.dataoder irgendetwas anderes. Sie könnten sogar verwenden donaldTrump.data, das wird auch funktionieren. Obwohl Sie sinnvolle Variablennamen verwenden sollten, sind Sie sich nicht sicher, ob dieser sinnvoll ist.
Gaurav Arya
Dies liegt daran, dass das Erfolgsobjekt ein Array mit dem Namen datahat, das die Daten enthält, die als Antwort von Ihrem Server eingehen. Sie müssen auf dieses <yourSuccessObjectName>.data
Datenarray
2

Wenn Sie versuchen, AngularJs 1.6.6 ab dem 21.10.2017 zu verwenden, funktioniert der folgende Parameter als .success und wurde erschöpft. Die .then () -Methode akzeptiert zwei Argumente: eine Antwort und einen Fehlerrückruf, die mit einem Antwortobjekt aufgerufen werden.

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

Das obige Snipit funktioniert für eine Anmeldeseite.

Wazzie
quelle