Aufrufe laut AngularJS doc , $http
um Folgendes zurückzugeben:
Gibt ein Versprechen- Objekt mit der Standard- Then- Methode und zwei http-spezifischen Methoden zurück: Erfolg und Fehler . Die then- Methode verwendet zwei Argumente, einen erfolgreichen und einen fehlerhaften Rückruf, die mit einem Antwortobjekt aufgerufen werden. Die Erfolgs- und Fehlermethoden verwenden ein einziges Argument - eine Funktion, die aufgerufen wird, wenn die Anforderung erfolgreich ist oder fehlschlägt. Die an diese Funktionen übergebenen Argumente sind eine destrukturierte Darstellung des an die then-Methode übergebenen Antwortobjekts.
Abgesehen von der Tatsache, dass das response
Objekt in einem Fall zerstört ist, verstehe ich den Unterschied nicht
- Die übergebenen Erfolgs- / Fehlerrückrufe wurden als Argumente von übergeben
promise.then
- Die Rückrufe wurden als Argumente für die
promise.success
/promise.error
Methoden des Versprechens übergeben
Gibt es irgendwelche? Was ist der Sinn dieser beiden unterschiedlichen Möglichkeiten, scheinbar identische Rückrufe weiterzuleiten?
then
Rückrufe ein einziges Argument - die Antwort - währendsuccess
underror
einzelne Komponenten der Antwort als arguments-- nehmendata
,status
,header
, undconfig
..success()
Methode das ursprüngliche $ http-Versprechen-Objekt zurückgibt, da die Kette$http(...).success(...).error(...)
möglich ist. Wenn, wie vernünftig erscheint, auch die Umkehrung$http(...).error(...).success(...)
möglich ist,.error()
sollte auch das ursprüngliche Versprechungsobjekt zurückgegeben werden. Der Unterschied.then()
besteht darin, dass es ein neues Versprechen zurückgibt .promise.success = function(fn) { promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; };
success
dies veraltet ist. Von docs.angularjs.org/api/ng/service/$http#deprecation-noticeThe $http legacy promise methods success and error have been deprecated. Use the standard then method instead. If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error.
Hier gibt es bereits einige gute Antworten. Es lohnt sich jedoch, den Unterschied in der angebotenen Parallelität nach Hause zu fahren:
success()
gibt das ursprüngliche Versprechen zurückthen()
gibt ein neues Versprechen zurückDer Unterschied besteht darin
then()
, dass sequentielle Vorgänge ausgeführt werden, da jeder Anruf ein neues Versprechen zurückgibt.$http.get()
seqFunc1()
seqFunc2()
success()
treibt parallele Operationen an, da Handler nach dem gleichen Versprechen verkettet sind.$http.get()
parFunc1()
,parFunc2()
In parallelenquelle
then
erreicht ist, dazu führt, dass die Methodensuccess
underror
verschwinden. Auch für die HTTP - Fehlerantworten (zB 404) , die erstethen
inhttp.then(ok, err).then(ok, err)
wird auf die Pass -err
Handler aber die folgenden Einsen in den Pass werdenok
Handler. Grundsätzlichhttp.success().error().success().error()
sind sie verkettbar, aber $ q-Versprechen unterscheiden sich insofern erheblich, als es um das Versprechen und die Reihenfolge der Behandlung speziell geht (und nicht um die Bearbeitung von http-Anfragen). Es fiel mir schwer, das zu verstehen, bis ich genau hinschaute.success
underror
sind keine normale API eines Versprechens, sie sind mit dem Rückgabewert von $ http () verschraubt.success
wird ausgeführt, nachdem der erste ausgeführt wurde, aber bevor ein von ihm zurückgegebenes Versprechen gelöst wird, während der zweitethen
wartet. Wenn Sie keine Versprechen zurückgeben, verhalten sich beide gleich.Einige Codebeispiele für einfache GET-Anforderungen. Vielleicht hilft dies, den Unterschied zu verstehen. Verwenden von
then
:Verwenden von
success
/error
:quelle
data,status,header,config
gegenüber der einfachen Rückgaberesponse
?.then () ist verkettbar und wartet auf die Auflösung der vorherigen .then ().
.success () und .error () können verkettet werden, aber sie werden alle auf einmal ausgelöst (also nicht viel darauf hinweisen)
.success () und .error () eignen sich nur für einfache Aufrufe (Easy Maker):
Sie müssen dies also nicht eingeben:
Aber im Allgemeinen behandle ich alle Fehler mit .catch ():
Wenn Sie <= IE8 unterstützen müssen, schreiben Sie Ihre .catch () und .finally () wie folgt (reservierte Methoden im IE):
Arbeitsbeispiele:
Hier ist etwas, das ich in einem Code-Format geschrieben habe, um mein Gedächtnis darüber aufzufrischen, wie sich alles mit der Behandlung von Fehlern usw. verhält:
http://jsfiddle.net/nalberg/v95tekz2/
quelle
Zur Vervollständigung hier ein Codebeispiel, das die Unterschiede aufzeigt:
Erfolg \ Fehler:
dann:
quelle
Offizieller Hinweis: Erfolg und Fehler sind veraltet. Verwenden Sie stattdessen die Standard-Then-Methode.
Link: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http
Screenshot: Screenshot anzeigen
quelle