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

Wann ist die Verwendung von „.then(success, fail)' ein Antimuster für Versprechen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-25 22:15:13483Durchsuche

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

Wann gilt .then(success, fail) als Antipattern für Promises?

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:

  • Fehler in einem bestimmten Schritt speziell behandelt werden müssen.
  • Wenn kein Fehler auftritt, unterscheidet sich die nachfolgende Aktion erheblich.

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!

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