Heim >Web-Frontend >js-Tutorial >Warum ist „.then(success, fail)' ein Antipattern in JavaScript Promises?

Warum ist „.then(success, fail)' ein Antipattern in JavaScript Promises?

DDD
DDDOriginal
2024-12-31 16:45:09183Durchsuche

Why is `.then(success, fail)` an Antipattern in JavaScript Promises?

Antimuster: .then(success, fail) in 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:

  • Sie damit umgehen möchten Fehler, die für einen Schritt in der Verarbeitung spezifisch sind.
  • Je nachdem, ob ein Fehler vorliegt, möchten Sie unterschiedliche Maßnahmen ergreifen aufgetreten.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn