2012-10-26 12 views
9

Ich verwende angularjs Restful Service $ Ressource und ich rufe $ speichern Funktion. Der Fehlerrückruf, den ich an ihn übergebe, wird jedoch nicht aufgerufen. Der Server sendet einen 418-Fehler, von dem ich dachte, da er NOT 200 ist, würde das zum Aufruf des Fehler-Callbacks führen. Aber es tut es nie. Ich kann keine Dokumentation finden, die besagt, dass HTTP-Fehlercodes dazu führen, dass der Fehler-Callback aufgerufen wird.AngularJS-Dienst nicht Fehler Rückruf bei save() -Methode

Hier ist mein Code:

var modalScope = $scope.$new(); 
modalScope.showPassword = false; 
modalScope.message = null; 
modalScope.user = new User(); 

modalScope.submit = function(user) { 
    user.$save({}, function(data,headers) { 
     // do the success case 
    }, function(data,headers) { 
     // do the error case     
    }); 
}; 

Die modalScope.user der definierten einreichen Funktion übergeben wird. Also, was ist das Problem, warum dieser Fehler Callback nicht aufgerufen wird?

+0

So wird 'Erfolg' Callback immer aufgerufen? – Tosh

+0

Ja, der Erfolgsrückruf wird immer aufgerufen. – chubbsondubs

+4

Ich glaube ich habe das Problem gefunden, dein Webserver ist eine Teekanne. –

Antwort

8

ich folgendes in der ngResource Quellcode

$http({method: 'GET', url: '/someUrl'}). 
    success(function(data, status, headers, config) { 
     // this callback will be called asynchronously 
     // when the response is available 
    }). 
    error(function(data, status, headers, config) { 
     // called asynchronously if an error occurs 
     // or server returns response with status 
     // code outside of the <200, 400) range 
    }); 

Ich bin ein bisschen verwirrt über die Reichweite Notation gefunden, aber es scheint, es den Fehler tatsächlich Methode aufrufen sollte. Vielleicht hast du einen Fehler gefunden.

+2

Angularjs Dokumentation ist absolut miserabel. Sie sind wirklich schrecklich. Ich kann nicht genug sagen, wie furchtbar furchtbar sie sich selbst erklären. Davon abgesehen denke ich, dass zwischen 100-200, 400-499 NICHT als Fehler betrachtet werden. WTF ?! Recht?! Wie zur Hölle macht das Sinn? Ein 404 wäre ein Fehler! Welche Seite in den Dokumenten hast du gefunden? Ich werde einen Kommentar posten, in dem ich sie auffordere, ihre fade Politik zu klären und möglicherweise zu ändern. – chubbsondubs

+0

Mist, ich las deinen Kommentar noch einmal. Es war im Quellcode. Yay für die Dokumentation. Wie auch immer, danke, dass du das gefunden hast! – chubbsondubs

+0

@chubbsondubs Ich habe es nicht in den Dokumenten gefunden, sondern im eckigen Quellcode. Suchen Sie nach "400)" hier, um die Passage zu finden: https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js –

4

Ich hatte Probleme mit dem Fehler-Callback als gut, aber es scheint, dass jetzt in neueren Versionen von AngularJS, muss die Fehler-Callback-Methode so etwas wie dies umgesetzt werden:

SomeResource.query({}, angular.noop, function(response){ 
    $scope.status = response.status; 
}); 

Quelle + ausführlichere Beschreibung: https://groups.google.com/d/msg/angular/3Q-Ip95GViI/at8cF5LsMHwJ

Auch als Reaktion auf die Kommentare zu Fleks Beitrag scheint es, dass jetzt nur Antworten zwischen 200 und 300 nicht als Fehler angesehen werden.

0

Ich bin Kopieren vom ngResource documentation:

Die Aktion Methoden auf das Klassenobjekt oder Instanzobjekt kann mit den folgenden Parametern aufgerufen:

  • HTTP GET „Klasse“ Aktionen: Resource.action ([Parameter], [Erfolg], [Fehler])
  • Nicht-GET "Klassen" Aktionen: Resource.action ([Parameter], PostData, [Erfolg], [Fehler])
  • nein n-GET-Instanzaktionen: instance. $ action ([Parameter], [Erfolg], [Fehler])

Der erfolgreiche Rückruf wird mit (value, responseHeaders) -Argumenten aufgerufen. Fehler Callback wird mit (httpResponse) -Argument aufgerufen.

$save wird als nicht-GET "Klasse" Aktion betrachtet, so müssen Sie einen zusätzlichen postData Parameter zu verwenden. Unter Verwendung der gleichen Frage Beispiel sollte diese Arbeit:

modalScope.submit = function(user) { 
    user.$save({}, {}, function(data,headers) { 
     // do the success case 
    }, function(response) { 
     // do the error case     
    }); 
}; 

Halten Sie ein Auge auf den Fehler-Callback, im Vergleich zum Beispiel mit ruft nur einem Argument, das alle HTTP-Antwort bringt.

+2

Ist $ save() eine Instanz-Aktion, die den Fehler-Callback zum dritten Parameter macht? – PilotBob

2

Ich konnte es nicht ändern Antwort an die Arbeit, aber das war für mich:

user.$save(function (user, headers) { 
        // Success 
        console.log("$save success " + JSON.stringify(user)); 
       }, function (error) { 
        // failure 
        console.log("$save failed " + JSON.stringify(error)) 
       }); 
5

hatte das gleiche Problem und wir haben hier nichts gearbeitet. Es stellte sich heraus, dass ich einen benutzerdefinierten Debug-Interceptor hatte, der nicht explizit $ q.reject (response) zurückgab.

Anscheinend überschreibt jeder benutzerdefinierte Debug-Interceptor das Standardverhalten vollständig.

Siehe https://github.com/angular/angular.js/issues/2609#issuecomment-44452795 für wo ich die Antwort gefunden habe.

+0

Sie sparen meinen Tag! –

+0

Ran in die gleiche Ausgabe. Danke dafür! – weltschmerz

+0

Das hat mir viel Zeit gespart. Das Problem war in einem unserer Abfangjäger. Vielen Dank – dimiguel

-1

Eigentlich, wenn wir die Dokumentation folgen. es funktioniert

User.save(vm.user, function (response) { 
       FlashService.Success('Registration successful', true); 
       $location.path('/login'); 
     }, 
     function (response) { 

      FlashService.Error(response.data); 
      vm.dataLoading = false; 

     }); 

oben ist snip von meinem Code funktioniert es.

Verwandte Themen