Heim >Web-Frontend >js-Tutorial >Warum ist „.then(success, fail)' ein Antipattern in JavaScript Promises?
Das Argument zur Vermeidung von .then(success, fail)
In den FAQ zum Bluebird-Versprechen wird davon abgeraten, .then(success, fail) als Antimuster zu verwenden. Während Try-Catch-Blöcke analog erscheinen mögen, gibt es Unterschiede:
Unterschiede im Kontrollfluss:
.then(success, fail) gibt ein Versprechen zurück, das abgelehnt wird, wenn Der Erfolgsrückruf löst einen Fehler aus. Das bedeutet, dass, wenn der Erfolgslogger fehlschlägt, der Fehler an den .catch()-Callback und nicht an den Fail-Callback weitergeleitet wird.
Kontrollflussdiagramme:
[ Dann mit zwei Argumenten](https://i.sstatic.net/WAcpP.png)
[Then-catch Kette](https://i.sstatic.net/wX5mr.png)
Synchronisches Äquivalent:
// then: { try ... catch(e) { ... } else ... } try { var results = some_call(); } catch(e) { logger.log(e); break then; } // else logger.log(results);
Behandlung von Ausnahmen:
Der .catch()-Logger verarbeitet auch Ausnahmen vom Erfolgslogger-Aufruf und bietet so eine umfassendere Fehlerbehandlung Mechanismus.
Vorwegnahme der Nützlichkeit des Antimusters
Während vom Antimuster im Allgemeinen abgeraten wird, kann es nützlich sein, wenn:
Vorbehalt: Beachten Sie, dass dieser Ansatz eine Verzweigung in den Kontrollfluss einführt.
Alternative zu .then(success, fail)
Um Codeduplizierung zu vermeiden, sollten Sie die Verwendung von .catch und in Betracht ziehen .done:
some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); });
Oder Sie können sich für .finally() entscheiden, um sowohl Erfolgs- als auch Misserfolgsszenarien zu bewältigen.
Das obige ist der detaillierte Inhalt vonWarum ist „.then(success, fail)' ein Antipattern in JavaScript Promises?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!