Heim >Web-Frontend >js-Tutorial >Wann ist die Verwendung von „.then(success, fail)' ein Antimuster in Promises?

Wann ist die Verwendung von „.then(success, fail)' ein Antimuster in Promises?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-28 18:36:13847Durchsuche

When is Using `.then(success, fail)` an Antipattern in Promises?

.then(success, fail): Wann gilt es als Antimuster für Promises?

In den Bluebird Promise FAQ ist .then(success, fail) markiert als Antimuster. Dies kann verwirrend sein, insbesondere wenn Sie die Erklärung zu Try- und Catch-Anweisungen nicht verstehen.

Was ist das Problem mit .then(success, fail)?

Der .then()-Aufruf gibt ein Versprechen zurück, das abgelehnt wird, wenn der Rückruf einen Fehler auslöst. Das heißt, wenn die Erfolgsprotokollierung fehlschlägt, wird der Fehler an den folgenden .catch()-Rückruf weitergeleitet, nicht an den fehlgeschlagenen Rückruf, der den Erfolg begleitet.

Kontrollflussdiagramm

Der Kontrollfluss für .then mit zwei Argumenten und einer .then-catch-Kette ist unten dargestellt:

[Bild von Kontrollflussdiagrammen für .then und .then-catch Kette]

Synchronous Code Equivalent

Um dies in synchronem Code auszudrücken:

// 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);
}

.then(success) vs. .then().catch()

Vergleichen Sie dies mit:

// some_promise_call().then(logger.log).catch(logger.log)
try {
    var results = some_call();
    logger.log(results);
} catch(e) {
    logger.log(e);
}

In diesem Fall übernimmt der Catch-Logger die Verarbeitung Ausnahmen vom Success-Logger-Aufruf.

Wann ist .then(success, fail) ein Antipattern?

Das Argument gegen dieses Muster ist, dass Sie generell Fehler in jedem Verarbeitungsschritt abfangen und die Verwendung vermeiden sollten es in Ketten. Es wird erwartet, dass Sie nur einen letzten Behandler für alle Fehler haben.

Dieses Muster ist jedoch hilfreich, wenn Sie bestimmte Fehler in einem bestimmten Schritt behandeln und eine andere Aktion ergreifen, wenn kein Fehler auftritt. Beachten Sie, dass dadurch Ihr Kontrollfluss verzweigt wird.

Verbessertes Antipattern-Beispiel

Bedenken Sie Folgendes:

some_promise_call()
   .catch(function(e) {
       return e; // it's OK, we'll just log it
   })
   .done(function(res) {
       logger.log(res);
   });

Alternativ können Sie .finally() für diesen Zweck verwenden.

Das obige ist der detaillierte Inhalt vonWann ist die Verwendung von „.then(success, fail)' ein Antimuster in 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