Wann wird dann (Erfolg, Misserfolg) als Antipattern für Versprechungen angesehen?
Hatte ich einen Blick auf die bluebird Versprechen FAQin denen es erwähnt, dass .dann(Erfolg, Fehler)
ist ein antipattern. Ich verstehe nicht ganz, seine Erklärung für die try und catch.
Was ist daran falsch?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Es scheint, das Beispiel ist was die folgenden als dem richtig Weg.
some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })
Was ist der Unterschied?
InformationsquelleAutor der Frage user2127480 | 2014-07-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
.then()
Aufruf zurück ein Versprechen, das wird abgelehnt, falls der Rückruf wirft einen Fehler. Das bedeutet, wenn sich Ihr Erfolglogger
fehlschlägt, wird der Fehler weitergegeben werden, die folgenden.catch()
Rückruf, aber nicht auf diefail
Rückruf, geht zusammen mitsuccess
.Hier ein Ablaufsteuerung Diagramm:
Auszudrücken synchronous code:
Zweiten
log
(das ist wie das erste argument für.then()
) wird nur ausgeführt, im Fall, dass keine Ausnahme passiert ist. Den gekennzeichneten block und diebreak
Aussage fühlen sich ein bisschen seltsam, das ist eigentlich das, was python hattry-except-else
für (zum Lesen empfohlen!).Den
catch
logger wird auch die Behandlung von Ausnahmen von dem Erfolg logger-Aufruf.So viel für die Differenz.
Das argument ist, dass in der Regel Sie möchten, um Fehler abzufangen, in jedem Schritt der Verarbeitung, und dass sollten Sie nicht verwenden es in Ketten. Die Erwartung ist, dass Sie nur noch eine Letzte handler behandelt alle Fehler - während, wenn Sie die "antipattern", Fehler in einigen der damals Rückrufe erfolgen nicht.
Jedoch, dieses Muster ist eigentlich sehr nützlich: Wenn Sie möchten, um Fehler zu behandeln, dass es in genau dieser Schritt, und Sie wollen etwas tun ganz anderewenn kein Fehler passiert ist - also wenn die Fehler nicht behebbarer ist. Bewusst seindass dies Verzweigung Ihre Steuern fließen. Natürlich, dies ist manchmal erwünscht.
Dass Sie wiederholen mussten Ihren Rückruf. Sie wollen lieber
Könnten Sie auch erwägen,
.endlich()
.InformationsquelleAutor der Antwort Bergi
Die beiden sind nicht ganz identisch. Der Unterschied ist, dass das erste Beispiel nicht abfangen einer Ausnahme, die ausgelöst wird in Ihrer
success
handler. Also, wenn Sie Ihre Methode sollte immer nur zurück gelöst verspricht, wie es oft der Fall, müssen Sie einen abschließendencatch
- handler (oder noch eine anderethen
mit einem leerensuccess
parameter). Sicher, es kann sein, dass Ihrthen
handler tut nichts, die möglicherweise fehlschlagen, in diesem Fall mit einer 2-parameterthen
könnte in Ordnung sein.Aber ich glaube, der Punkt, der den text, den Sie verlinkt ist, dass
then
ist vor allem nützlich gegen Rückrufe ist in seiner Fähigkeit, die an die Kette einer Reihe von asynchronen Schritte, und wenn Sie dieses tatsächlich zu tun, der 2-parameter-form vonthen
subtil verhält sich nicht ganz wie erwartet, aus den oben genannten Gründen. Es ist vor allem widersinnig, wenn verwendet, Mitte der Kette.Als jemand, der ' s getan, eine Menge von komplexen asynchronen Zeug und stieß in die Ecken wie diese mehr als ich wohl zugeben, dass ich wirklich empfehlen kann, um dieses anti-Muster und gehen mit dem separaten hf-Ansatz.
InformationsquelleAutor der Antwort acjay
Durch den Blick auf Vorteile und Nachteile von beiden können wir eine berechnete Vermutung, das ist angemessen für die situation.
Dies sind die zwei wichtigsten Ansätze für die Implementierung verspricht. Beide haben es die Plusse und die minus
Vorteile
Nachteile
Vorteile
Nachteile
catch
wenn Sie möchten-handler-Fehler, die ausgelöst durch den Erfolg-RückrufInformationsquelleAutor der Antwort aWebDeveloper
Statt Worte, gutes Beispiel. Folgenden code (wenn der erste Versprechen gelöst):
ist identisch zu:
Aber mit verworfenen erste Versprechen, das nicht identisch ist:
InformationsquelleAutor der Antwort ktretyak