Heim >Web-Frontend >js-Tutorial >Wann ist die Verwendung von „.then(success, fail)' ein Antimuster für Versprechen?
Die Promise-FAQ von Bluebird legt nahe, dass die Verwendung von .then(success, fail) ein Antipattern ist. Dies liegt daran, dass .then()-Aufrufe ein Versprechen zurückgeben, das abgelehnt wird, wenn der Rückruf einen Fehler auslöst. Wenn der Erfolgslogger-Rückruf fehlschlägt, wird der Fehler daher an den folgenden .catch()-Rückruf weitergeleitet, nicht jedoch an den Fehlerrückruf, der neben dem Erfolgsrückruf bereitgestellt wird.
Kontrollfluss Diagramm:
[Bild von Kontrollflussdiagrammen für then mit zwei Argumenten und then Catch Kette]
Synchronisches Äquivalent:
// some_promise_call().then(logger.log, logger.log) then: { try { var results = some_call(); } catch(e) { logger.log(e); break then; } // else logger.log(results); } // some_promise_call().then(logger.log).catch(logger.log) try { var results = some_call(); logger.log(results); } catch(e) { logger.log(e); }
Musterbegründung:
Normalerweise werden Fehler in jedem Schritt von abgefangen Die Verarbeitung und Fehlerbehandlung ist zentralisiert, sodass alle Fehler von einem einzigen Endhandler behandelt werden. Das im Antimuster erwähnte Muster ist jedoch nützlich, wenn:
Dieses Muster kann zu Verzweigungen im Steuerelement führen flow.
Empfohlenes Muster:
Anstatt den Rückruf zu wiederholen, sollten Sie .catch() und .done() verwenden:
some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); });
Sie können auch die Verwendung von .finally() in Betracht ziehen.
Das obige ist der detaillierte Inhalt vonWann ist die Verwendung von „.then(success, fail)' ein Antimuster für Versprechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!