Ich verwende $http
in AngularJs und bin mir nicht sicher, wie ich das zurückgegebene Versprechen verwenden und mit Fehlern umgehen soll.
Ich habe diesen Code:
$http
.get(url)
.success(function(data) {
// Handle data
})
.error(function(data, status) {
// Handle HTTP error
})
.finally(function() {
// Execute logic independent of success/error
})
.catch(function(error) {
// Catch and handle exceptions from success/error/finally functions
});
Ist das ein guter Weg, oder gibt es einen einfacheren Weg?
success()
,error()
undfinally()
kombiniert mitcatch()
? Oder muss ich verwendenthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);
success
underror
(bevorzugen.then
und.catch
stattdessen können (und sollten) SieerrorFunction
die.then
Verwendung von accatch
wie in meinem Code oben weglassen ).success
/ zu vermeidenerror
? Auch meine Eclipse läuft Amok, wenn sie das sieht.catch(
, also benutze ich es vorerst["catch"](
. Wie kann ich Eclipse zähmen?.success
und.error
$ http gibt ein $ q-Versprechen mit dem Zusatz dersuccess
underror
-Handler zurück. Diese Handler sind jedoch nicht verkettet und sollten generell vermieden werden, wenn / wenn möglich. Im Allgemeinen - wenn Sie Fragen haben, ist es am besten, sie als neue Frage und nicht als Kommentar zu einer alten Frage zu stellen.Vergessen Sie die Verwendung
success
underror
Methode.Beide Methoden sind in Winkel 1.4 veraltet. Grundsätzlich liegt der Grund für die Abwertung darin, dass sie sozusagen nicht verkettenfreundlich sind .
Mit dem folgenden Beispiel werde ich versuchen zu demonstrieren, was ich meine
success
underror
nicht kettenfreundlich zu sein . Angenommen, wir rufen eine API auf, die ein Benutzerobjekt mit einer Adresse zurückgibt:Benutzerobjekt:
Aufruf der API:
Was ist passiert?
Weil
success
underror
das ursprüngliche Versprechen zurückgeben , dh das von zurückgegebene$http.get
, ist das an den Rückruf von übergebene Objektthen
das gesamte Benutzerobjekt , dh die gleiche Eingabe für den vorhergehendensuccess
Rückruf.Wenn wir zwei verkettet hätten
then
, wäre dies weniger verwirrend gewesen:quelle
success
underror
sind nur für die sofortige Rückgabe hinzugefügt des$http
Anrufs (nicht der Prototyp), so dass , wenn Sie ein anderes Versprechen Verfahren zwischen ihnen nennen (wie Sie in der Regel rufen Siereturn $http.get(url)
in einer Basisbibliothek eingewickelt, aber später entscheiden , einen Spinner wechseln in Wenn die Bibliothek mitreturn $http.get(url).finally(...)
) aufruft, stehen Ihnen diese praktischen Methoden nicht mehr zur Verfügung.Ich denke, die vorherigen Antworten sind korrekt, aber hier ist ein weiteres Beispiel (nur zu Ihrer Information, Erfolg () und Fehler () sind laut AngularJS- Hauptseite veraltet :
quelle
Welche Art von Granularität suchen Sie? Sie können in der Regel auskommen mit:
Ich habe festgestellt, dass "endlich" und "fangen" besser dran sind, wenn mehrere Versprechen verkettet werden.
quelle
loading = false
).catch()
Im Fall von Angular $ http wurde für die Funktion success () und error () das Antwortobjekt entpackt, sodass die Rückrufsignatur wie $ http (...) lautet. Success (Funktion (Daten, Status, Header, Konfiguration))
Für then () werden Sie sich wahrscheinlich mit dem rohen Antwortobjekt befassen. wie im AngularJS $ http API-Dokument veröffentlicht
Der letzte .catch (...) wird nur benötigt, wenn in der vorherigen Versprechenskette ein neuer Fehler aufgetreten ist.
quelle
Ich mache es so, wie Bradley Braithwaite es in seinem Blog vorschlägt :
Es ist ziemlich stabil und sicher, und wenn Sie andere Bedingungen haben, um das Versprechen abzulehnen, können Sie Ihre Daten jederzeit in der Erfolgsfunktion filtern und
deferred.reject(anotherReason)
mit dem Grund der Ablehnung anrufen .Wie Ryan Vice in den Kommentaren angedeutet hat , kann dies nicht als nützlich angesehen werden, es sei denn, Sie spielen sozusagen ein bisschen mit der Antwort herum.
Weil
success
underror
seit 1.4 veraltet sind, ist es vielleicht besser, die regulären Versprechensmethoden zu verwendenthen
undcatch
die Antwort innerhalb dieser Methoden zu transformieren und das Versprechen dieser transformierten Antwort zurückzugeben.Ich zeige das gleiche Beispiel mit beiden Ansätzen und einem dritten Zwischenansatz:
success
underror
Ansatz (success
underror
ein Versprechen einer HTTP-Antwort zurückgeben, daher benötigen wir die Hilfe$q
, um ein Versprechen von Daten zurückzugeben):then
undcatch
Annäherung (dies ist aufgrund des Wurfs etwas schwieriger zu testen):Es gibt jedoch eine Lösung auf halbem Weg (auf diese Weise können Sie das vermeiden
throw
und müssen es wahrscheinlich verwenden$q
, um das Versprechen in Ihren Tests zu verspotten):Kommentare oder Korrekturen jeglicher Art sind willkommen.
quelle
success()
underror()
würde kein neues Versprechen zurückgeben, wie esthen()
tut. Mit$q
machen wir unsere Fabrik, um ein Versprechen von Daten anstelle eines Versprechens einer HTTP-Antwort zurückzugeben.