Im Grunde fragen Sie sich also, was der Unterschied zwischen diesen beiden ist (wo p
ist ein Versprechen, das aus einem vorherigen Code erstellt wurde):
return p.then(...).catch(...);
und
return p.catch(...).then(...);
Es gibt Unterschiede, entweder wenn p aufgelöst oder abgelehnt wird, aber ob diese Unterschiede wichtig sind oder nicht, hängt davon ab, was der Code in den .then()
oder .catch()
Handlern tut.
Was passiert, wenn p
gelöst wird:
Im ersten Schema wird beim p
Auflösen der .then()
Handler aufgerufen. Wenn dieser .then()
Handler entweder einen Wert oder ein anderes Versprechen zurückgibt, das schließlich aufgelöst wird, wird der .catch()
Handler übersprungen. Wenn der .then()
Handler jedoch ein Versprechen auslöst oder zurückgibt, das schließlich .catch()
abgelehnt wird, führt der Handler sowohl eine Ablehnung im ursprünglichen Versprechen p
als auch einen Fehler aus, der im .then()
Handler auftritt .
Im zweiten Schema wird beim p
Auflösen der .then()
Handler aufgerufen. Wenn dieser .then()
Handler ein Versprechen wirft oder zurückgibt, das schließlich abgelehnt wird, kann der .catch()
Handler das nicht abfangen, da es sich in der Kette davor befindet.
Das ist also der Unterschied Nr. 1. Wenn der .catch()
Handler AFTER ist, kann er auch Fehler im .then()
Handler abfangen .
Was passiert, wenn p
abgelehnt wird:
Wenn das Versprechen im ersten Schema p
abgelehnt wird, wird der .then()
Handler übersprungen und der .catch()
Handler wird wie erwartet aufgerufen. Was Sie im .catch()
Handler tun, bestimmt, was als Endergebnis zurückgegeben wird. Wenn Sie nur einen Wert vom .catch()
Handler zurückgeben oder ein Versprechen zurückgeben, das schließlich aufgelöst wird, wechselt die Versprechen-Kette in den gelösten Zustand, weil Sie den Fehler "behandelt" und normal zurückgegeben haben. Wenn Sie ein abgelehntes Versprechen in den .catch()
Handler werfen oder zurückgeben, bleibt das zurückgegebene Versprechen abgelehnt.
Wenn im zweiten Schema das Versprechen p
abgelehnt wird, wird der .catch()
Handler aufgerufen. Wenn Sie einen normalen Wert oder ein Versprechen zurückgeben, das schließlich vom .catch()
Handler behoben wird (wodurch der Fehler "behandelt" wird), wechselt die Versprechen-Kette in den aufgelösten Zustand und der .then()
Handler nach dem .catch()
Aufruf des.
Das ist also der Unterschied Nr. 2. Wenn der .catch()
Handler VORHER ist, kann er den Fehler behandeln und dem .then()
Handler ermöglichen, weiterhin aufgerufen zu werden.
Wann welche zu verwenden:
Verwenden Sie das erste Schema, wenn Sie nur einen .catch()
Handler möchten , der Fehler entweder im ursprünglichen Versprechen p
oder im .then()
Handler abfangen kann, und eine Ablehnung von p
sollte den .then()
Handler überspringen .
Verwenden Sie das zweite Schema, wenn Sie in der Lage sein möchten, Fehler im ursprünglichen Versprechen zu erkennen, p
und möglicherweise (abhängig von den Bedingungen) zulassen, dass die Versprechen-Kette wie gelöst fortgesetzt wird, und so den .then()
Handler ausführen .
Die andere Option
Es gibt eine weitere Option, um beide Rückrufe zu verwenden, an die Sie .then()
wie folgt übergeben können :
p.then(fn1, fn2)
Dies garantiert, dass nur einer von fn1
oder fn2
jemals aufgerufen wird. Wenn es aufgelöst wird p
, fn1
wird es aufgerufen. Wenn p
abgelehnt, fn2
wird aufgerufen. Keine Änderung des Ergebnisses in fn1
kann jemals dazu führen, dass fn2
man angerufen wird oder umgekehrt. Wenn Sie also unbedingt sicherstellen möchten, dass nur einer Ihrer beiden Handler aufgerufen wird, unabhängig davon, was in den Handlern selbst geschieht, können Sie verwenden p.then(fn1, fn2)
.