Angular.js: $http-Dienst ruft nicht auf Fehler Rückruf auf 400

Erstellt am 8. Mai 2013  ·  26Kommentare  ·  Quelle: angular/angular.js

Version: 1.1.4

createNewWall: function(wall, successCallback, errorCallback) {
    return $http.post($rootScope.baseAppsAPI + '/walls', null, {
       params: wall
    }).success(function(data, status) {
       return successCallback.call(this, data);
    }).error(function(data) {
       return errorCallback.call(this, data);
    });
}

Ich habe überprüft, dass die Funktion "Angular isSuccess" korrekt funktioniert. Ich habe dies getan, indem ich es zum Fensterobjekt hinzugefügt und überprüft habe, ob der folgende Code (in meinem erfolgreichen Rückruf platziert) dazu führte, dass der Fehlerrückruf aufgerufen wurde.

if (window.isSuccess(status)) {
   return successCallback.call(this, data);
} else {
  return errorCallback.call(this, data);
}

Irgendeine Idee, was das Problem verursacht? Läuft etwas schief, wenn die $http-Versprechen nicht korrekt abgelehnt/aufgelöst werden?

Hilfreichster Kommentar

Für mich hat die Antwort von @lsiv568 den Trick gemacht. Es ist zunächst etwas seltsam, aber Sie müssen ein abgelehntes Versprechen manuell zurückgeben, wenn Sie einen Fehlerabfangjäger erstellen ( source ).

.factory('myInterceptor', function($q) {
  return {
    response: function (response) { return response; },
    responseError: function(response) {
      // do stuff or
      return $q.reject(response);
    }
  };
});

Alle 26 Kommentare

Ich stehe vor dem gleichen Problem. Die Art und Weise, wie Sie das Problem geschlossen haben, kann bedeuten, dass ich etwas falsch mache usw. Können Sie bitte Ihre Lösung teilen? Kann das nirgendwo finden.

Robert.,

Ich habe das Problem geschlossen, weil das Problem (auf wundersame Weise) verschwunden war, nachdem ich
habe ein paar Änderungen an meinem Service vorgenommen. Es scheint jedoch zurückzukommen
intermittierend. Also, ich weiß nicht mehr, ob es ein Problem von meiner Seite ist oder a
echtes Problem mit Winkel. Wenn Sie möchten, kann ich das Problem erneut öffnen und Sie können
füge dein Problem hinzu? Funktioniert das für dich?

Am Montag, den 13. Mai 2013 um 9:13 Uhr schrieb Robert [email protected] :

Ich stehe vor dem gleichen Problem. Die Art und Weise, wie Sie das Problem geschlossen haben, kann bedeuten, dass ich
kann etwas falsch machen usw. Können Sie bitte Ihre Lösung teilen? Kippen
finde das überall.


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf Gi tHub anhttps://github.com/angular/angular.js/issues/2609#issuecomment -17810417
.

Respektvoll,

Louis W. Sivillo

Wie oben erwähnt, öffne ich dieses Problem erneut, da es zeitweise auftritt. rtpm, bitte fügen Sie Ihren Anwendungsfall/alle zusätzlichen Informationen hinzu, die bei der Identifizierung des Problems helfen können

Robert,
Danke, dass du das mitgeschickt hast.

Ich hatte einen http-Interceptor, den ich für die grundlegende Authentifizierung geschrieben habe, der das Versprechen bei Antwortfehlern nicht ablehnte.

Danke, Bot von euch. Ich hatte das gleiche Problem.

+1 passiert mir, wenn der Server 401 zurückgibt

+1
Rückruffunktion funktioniert nicht, während der Server den Statuscode 401 zurückgibt.

Gibt es diesbezüglich Fortschritte? Habe das gleiche Problem mit einer 400.

Für mich hat die Antwort von @lsiv568 den Trick gemacht. Es ist zunächst etwas seltsam, aber Sie müssen ein abgelehntes Versprechen manuell zurückgeben, wenn Sie einen Fehlerabfangjäger erstellen ( source ).

.factory('myInterceptor', function($q) {
  return {
    response: function (response) { return response; },
    responseError: function(response) {
      // do stuff or
      return $q.reject(response);
    }
  };
});

Habe das gleiche Problem mit einem 400..
Aber warum ist das Problem geschlossen, gibt es eine spezielle Lösung für dieses Problem?

Ich habe dieses Problem auch mit Fehler 400. Wurde dieses Problem behoben? Wenn ja, in welcher Version?

Ich habe das gleiche Problem mit allen > 299 Fehlern. Ich verwende Restangular mit einem benutzerdefinierten Antwort-Interceptor, erhalte jedoch den Fehler mit dem standardmäßigen $http-Dienst, mit Ausnahme eines CSRF-Token-Headers. (Ich habe trotzdem versucht, das zurückgestellte Objekt aus Restangular heraus manuell abzulehnen, aber wie erwartet hat das nichts geändert.)

Ich habe dieses Problem auch, können wir das wieder öffnen?

Das in der ursprünglichen Ausgabe gemeldete Problem war darauf zurückzuführen, dass ein benutzerdefinierter Interceptor Fehlerbedingungen nicht richtig behandelte (eine Zusage wurde nicht abgelehnt). Wenn jemand immer noch auf ein Problem stößt, handelt es sich höchstwahrscheinlich um dieselbe Situation - bitte vergewissern Sie sich, dass Sie keine fehlerhaften benutzerdefinierten Abfangvorrichtungen haben. Wenn Sie immer noch glauben, dass auf der AngularJS-Seite etwas nicht stimmt, stellen Sie bitte ein _minimales Live-Reproduktionsszenario bereit (idealerweise mit http://plnkr.co/, aber jedes andere ähnliche Tool reicht aus).

@pkozlowski-opensource Danke, ich kann in der Tat bestätigen, dass dies mein Problem war (d'oh).

Es sollte einen Hinweis in den Angular-Dokumenten dazu geben - ich hatte keine Ahnung, dass ich das $http-Versprechensverhalten bei der Implementierung meines Abfangjägers vollständig überschrieben habe.

Ich bin auch auf dieses Problem gestoßen und hatte einen Interceptor, den ich mir immer wieder ansah, weil er tatsächlich die richtige Rückkehr hatte. Endlich habe ich den Schuldigen gefunden. Wenn Sie mehrere Aufrufe von success/error verwenden oder tatsächlich sicherstellen müssen, dass sie auch das Richtige zurückgeben :) Success Callbacks sollten die geänderte Antwort zurückgeben, während Error Callbacks eine Ablehnung mit $q.reject genau wie der Interceptor zurückgeben sollten.

+1 danke Leute. Ich hatte das gleiche Problem mit der globalen Anpassung des $http.interceptor

+1 für @chmanies Antwort. Vielen Dank! Unser Problem behoben.

+1 Danke @chmanie! habe mein Problem auch behoben

+1 Danke, die Ablehnung hat es für mich behoben!

+1 .danke das hat mein Problem behoben.

+1 Danke, die Ablehnung hat es für mich behoben!

Die Lösung von @chmanie funktioniert bei mir.

@chmanie- Lösung hat das Problem behoben. In den Angularjs-Dokumenten sollte dazu ein Hinweis enthalten sein.

@chmanie danke~

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen