Brich die JavaScript-Versprechenskette auf eine saubere Art und Weise

8

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: Ссылка

    
user6822275 11.12.2016, 11:16
quelle

2 Antworten

11
  

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 :

hinzufügen %Vor%

... 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:

%Vor%
    
T.J. Crowder 11.12.2016, 11:21
quelle
0

Wie @ T.J.Crowder sagte, haben Sie vergessen, return das Ergebnis des Error-Handlers (oder throw davon). Um es zu beheben, würde ich empfehlen, entweder

zu tun %Vor%

oder

%Vor%     
Bergi 11.12.2016 12:16
quelle

Tags und Links