Also, im Grunde Sie fragen, was ist der Unterschied zwischen diesen beiden (wo p
ist ein Versprechen aus einem früheren Code erstellt):
return p.then(...).catch(...);
und
return p.catch(...).then(...);
Es gibt Unterschiede entweder wenn p auflöst oder ablehnt, hängt es von dem ab, was der Code in den Handlern .then()
oder .catch()
tut.
Was, wenn p
löst passiert: genannt wird
Im ersten Schema, wenn p
Entschlüssen, die .then()
Handler. Wenn der -Handler entweder einen Wert oder ein anderes Versprechen zurückgibt, das schließlich verrechnet wird, wird der .catch()
-Handler übersprungen. Wenn jedoch der Handler entweder ein Versprechen zurückgibt oder zurückgibt, das schließlich ablehnt, wird der Handler .catch()
sowohl für eine Zurückweisung im ursprünglichen Versprechen p
als auch für einen Fehler im Handler ausgeführt.
Im zweiten Schema, wenn p
löst, wird der Handler aufgerufen. Wenn der Handler entweder ein Versprechen zurückgibt oder zurückgibt, das schließlich zurückweist, kann der Handler .catch()
den Fehler nicht abfangen, weil er zuvor in der Kette vorhanden ist.
Also, das ist der Unterschied # 1. Wenn der Handler .catch()
AFTER ist, kann er auch Fehler innerhalb des -Handlers erkennen.
Was passiert, wenn p
ablehnt:
nun in dem ersten Schema, wenn das Versprechen p
ablehnt, dann wird der .then()
Handler übersprungen und die .catch()
Handler werden aufgerufen, wie man es erwarten würde. Was Sie im Handler .catch()
tun, bestimmt, was als Endergebnis zurückgegeben wird. Wenn Sie einfach einen Wert aus dem Handler .catch()
zurückgeben oder eine Versprechung zurückgeben, die schließlich verrechnet wird, wechselt die Versprechungskette in den aufgelösten Status, weil Sie den Fehler "behandelt" und normal zurückgegeben haben. Wenn Sie ein abgelehntes Versprechen im Handler .catch()
werfen oder zurückgeben, bleibt das zurückgegebene Versprechen zurückgewiesen.
Im zweiten Schema, wenn das Versprechen zurückweist, dann wird der .catch()
Handler aufgerufen. Wenn Sie einen normalen Wert oder eine Zusage zurückgeben, die schließlich vom Handler .catch()
aufgelöst wird (also den Fehler "behandelt"), wechselt die Versprechungskette in den aufgelösten Zustand und der .then()
Handler nach dem .catch()
wird aufgerufen.
Also das ist der Unterschied # 2. Wenn der Handler .catch()
BEFORE ist, kann er den Fehler behandeln und ermöglichen, dass der Handler immer noch aufgerufen wird.
Wann welche:
das erste Schema verwenden, wenn Sie nur eine .catch()
Handler möchten, dass Fehler in entweder dem Urverheißung p
oder in der .then()
Handler und ein Zurückweisungs von p
sollte die .then()
Handler überspringen fangen .
Verwenden Sie das zweite Schema, wenn Sie Fehler in der ursprünglichen Verheißung p
abfangen möchten und (abhängig von den Bedingungen) möglicherweise zulassen, dass die Versprechenskette als gelöst fortfährt, und so den -Handler ausführt.
Die andere Option
gibt es noch eine andere Möglichkeit, beide Rückrufe zu verwenden, die Sie .then()
nach passieren kann:
p.then(fn1, fn2)
Dies garantiert, dass nur eine von fn1
oder fn2
jemals aufgerufen werden. Wenn aufgelöst wird, wird fn1
aufgerufen. Wenn zurückgewiesen wird, wird fn2
aufgerufen. Keine Änderung des Ergebnisses in fn1
kann jemals fn2
aufrufen oder umgekehrt werden. Wenn Sie also absolut sicher gehen wollen, dass nur einer Ihrer beiden Handler aufgerufen wird, unabhängig davon, was in den Handlern selbst geschieht, können Sie p.then(fn1, fn2)
verwenden.
Sowohl .then als auch .catch können das Versprechen ändern ... also bin ich mir nicht sicher, woher das Missverständnis kommt. Wenn Sie fangen vor dem. Dann, fangen sie Ablehnungen, die vor der. Dann und die dann ausgeführt wird es ist/fail Callbacks basierend auf, was passiert innerhalb der .Catch, und umgekehrt, wenn Sie sie tauschen. –
Sorry, wenn meine Frage nicht klar war. Aber in diesem Fall verhalten sich beide Fälle gleich, so dass ich den Unterschied nicht sehen kann. Kannst du mir sagen, wann wir VORHER den Fang fangen und wann wir uns danach entschieden haben? es danach zu setzen scheint wirklich intuitiv und üblich. Nur nicht sicher, warum manchmal wir es vor dann setzen – Zanko
Wenn sie das gleiche durchführen, ist es einfach, weil das, was jeder tut, das Ergebnis in diesem speziellen Fall nicht ändert. Eine geringfügige Änderung könnte das Ergebnis verändern. –