Ich versuche, Versprechen zu verketten, damit die Kette bricht, wenn ein Versprechen abgelehnt wird. Ich folgte den Leads eines vorherige SO-Frage und versuchte, es auf native Versprechungen anzuwenden, aber ich glaube, ich missverstehe die Art, wie die Dinge funktionieren.
So habe ich den Code umgeschrieben:
%Vor%Die Ausgabe des obigen Codes lautet:
%Vor%Nach meinem Verständnis sollte Schritt 2 die Kette unterbrechen und Schritt 3 sollte nicht ausgeführt werden. Wenn Schritt (2) eine abgelehnte Zusage zurückgibt, wird stepError (2) wie erwartet ausgeführt. Aber da es Promise.reject (2) zurückgibt, sollte die Funktion in der nächsten dann nicht ausgeführt werden, und da es am Ende keinen Catch gibt, scheint das abgelehnte Versprechen von Schritt 2 - wie erwartet - weitergeleitet zu werden, bis es die Kette, weil sie keinen Handler gefunden hat.
Was fehlt mir hier?
Hier ist ein JSFiddle, mit dem Sie spielen können: Ссылка
Nach meinem Verständnis sollte Schritt 2 die Kette durchbrechen ...
Es würde , aber Sie haben diese Zurückweisung versehentlich in eine Auflösung konvertiert.
Das Wichtigste an Versprechen ist, dass jeder Aufruf von then
ein neues Versprechen erstellt, das basierend auf den then
Callbacks und der Callback-Verarbeitung a aufgelöst / zurückgewiesen wird Ablehnung setzt diese Zurückweisung in eine Lösung um, es sei denn, dies geschieht absichtlich.
Also hier:
%Vor%Das ist so, dass Sie Fehlerhandler haben können, die den Fehler kompensieren.
Da stepError
eine Zurückweisung zurückgibt, können Sie die Ablehnung fortsetzen, indem Sie einfach return
:
... oder alternativ, entfernen Sie diesen Handler vollständig:
%Vor% ... oder Sie könnten throw
im Callback verwenden, was automatisch in eine Zurückweisung umgewandelt wird.
Die Warnung wegen nicht bearbeiteter Zurückweisung wird dadurch verursacht, dass nichts die Zurückweisung von stepError
verbraucht.
Hier ist ein Beispiel, das das Ergebnis von stepError
zurückgibt:
Tags und Links javascript promise