Wenn zum ablehnen/lösen ein Versprechen
Bin ich darüber nachdachte, wie genau muss ich ablehnen, ein Versprechen.
Ich fand ein paar Fragen zu diesem Thema, aber konnte nicht finden, eine richtige Antwort.
Wann sollte ich ablehnen, ein Versprechen?
Diesem Artikel
http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises
sagt:
- Beheben: Ein erfolgreiches Versprechen ist 'gelöst', die unter Berufung auf den Erfolg Listener wartet und merkt sich den Wert, der beschlossen wurde, für den Erfolg der Zukunft die Hörer angeschlossen sind. Auflösung entspricht der zurückgegebene Wert.
- Ablehnen: Wenn ein Fehler aufgetreten ist, ein Versprechen ist, "abgelehnt", das ruft den Fehler-Listener wartet und merkt sich den Wert, der abgelehnt wurde, für zukünftige Fehler Zuhörer verbunden sind. Ablehnung in Beziehung zu einer ausgelösten Ausnahme.
Ist das Prinzip Leitlinie?
Dass man nur gegen ein Versprechen, wenn eine Ausnahme aufgetreten ist?
Aber im Falle einer Funktion wie
findUserByEmail()
Ich würde erwarten, dass die Funktion zur Rückgabe eines Benutzers, so dass ich die Kette weiter, ohne zu überprüfen, ob das Ergebnis
findUserByEmail()
.then(sendWelcomeBackEmail)
.then(doSomeNiceStuff)
.then(etc..)
Welche sind am besten /häufigsten praktiziert?
- Ihre Beschreibung von Ablehnung kann falsch sein ich verstehe es, wenn von "der Zukunft" meinst du "unten in der Kette". Wenn ein error-handler wird ausgeführt, der Rückgabewert wird benutzt, um erfüllen (nicht ablehnen) nachfolgende verspricht. Also einmal ein Fehler-handler ausgeführt wird, wird der Fehler als behandelt, und die Ausführung erfolgt auf der Erfolg-Seite. Um es einen anderen Weg, wenn Sie wollen, um einen Fehler zu behandeln in aufeinander folgenden Schritten in der Kette, der erste Fehler-handler müssen rethrow, um für die nachfolgende Fehler-Handler in der Kette aufgerufen werden, genau wie try/catch.
- Zur info, der Artikel, den Sie zitieren, ist ein bisschen ungenau; es heißt "lösen", wenn er sagen sollte "erfüllen."
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen können Sie denken, Sie abzulehnen als Analog zu einem synchronen
throw
und Erfüllung als Analog zu einem synchronenreturn
. Sollten Sie ablehnen, wenn die Funktion nicht erfolgreich ist, in gewisser Weise. Das könnte ein timeout, ein Netzwerk-Fehler, falsche Eingabe etc. etc.Ablehnung ein Versprechen, wie eine Ausnahme zu werfen, ist nützlich für die Ablaufsteuerung. Es muss nicht zu vertreten haben, ein wirklich unerwarteter Fehler; es kann ein problem darstellen, dass Sie vollständig antizipieren und behandeln:
Die Ablehnung lässt uns direkt über die normalen Erfolg Verhalten, bis wir eine Methode, die weiß, wie man damit umgeht. Als weiteres Beispiel haben wir vielleicht eine Funktion, die für tief verschachtelte am unteren Rand der Anwendungen stack, der dem widerspricht. Dies kann nicht behandelt werden, bis ganz oben auf den Stapel, wo wir konnten loggen. Der Punkt ist, dass Ablehnungen Reisen in den stack genauso wie Ausnahmen im synchronen code.
Im Allgemeinen, wo immer möglich, wenn Sie kämpfen, um einige schreiben von asynchronem code, sollten Sie sich Gedanken "was würde ich schreiben, wenn diese synchron". Es ist in der Regel eine ziemlich einfache Umsetzung, von, dass, um die versprochenen gleichwertig.
Ein schönes Beispiel, wo abgelehnt verspricht verwendet werden können, liegt in einer
exists
Methode:Beachten Sie, wie in diesem Fall, die Ablehnung ist völlig zu erwarten und bedeutet einfach, dass die Datei nicht vorhanden ist. Beachten Sie auch, wie es parallels die synchrone Funktion:
Ihrem Beispiel
Rückkehr zu Ihrem Beispiel:
Ich würde normalerweise gewählt haben, lehnen die Versprechen, die aus
findUserByEmail
wenn kein Benutzer gefunden wurde. Es ist etwas, was Sie erwarten manchmal zu passieren, aber es ist die Ausnahme von der norm, und sollte wahrscheinlich behandelt werden, ziemlich ähnlich wie alle anderen Fehler. Ebenso, wenn ich schreiben eine synchrone Funktion haben würde ich esthrow
eine Ausnahme.Manchmal mag es nützlich sein, einfach zurück
null
statt, aber dies hängt davon ab, Ihre Anwendungen-Logik und ist wahrscheinlich nicht der beste Weg zu gehen.fs.exists
Funktion in node.js umgesetzt durch den Aufruffs.stat
und dann die Handhabung der Fehler.Weiß ich, wo du herkommst. Q-und Q-Dokumentation können Sie ganz einfach haben Sie glauben, dass latente/Versprechen Ablehnung ist alles über die Behandlung von Ausnahmen.
Ist dies nicht unbedingt der Fall.
Eine latente abgelehnt werden kann, aus welchem Grund auch immer Ihre Anwendung erfordert.
Deferreds/Versprechen sind alle über den Umgang mit Antworten von asynchronen Prozessen, und jeder asynchrone Prozesse können in der Folge zu einer Vielzahl von Ergebnissen, von denen einige sind "erfolgreich" und "fehlgeschlagen". Sie können wählen, zu verwerfen Ihr deferred - aus welchem Grund auch immer, unabhängig davon, ob das Ergebnis wurde nominell erfolgreich oder erfolglos, und ohne Ausnahme, die jemals geworfen worden, entweder in javascript oder in dem asynchronen Prozess.
Können Sie auch wählen, zu implementieren ein timeout bei einer asynchronen Prozess, in welchem Fall Sie vielleicht ablehnen ein latenter, ohne eine Antwort (erfolgreich oder erfolglos) erhalten. In der Tat, für die timeouts, das ist, was Sie normalerweise wählen.