Nachdem ich Dutzende von Artikeln darüber gelesen habe, wie großartig ES6 verspricht und warum wir sie umsetzen sollten, wurde mir das Gefühl gegeben, dass ALLE meiner (nicht-trivialen) JavaScript-Funktionen Versprechen sein sollten.
Tatsächlich fühle ich mich großartig, wenn ich Code schreibe, der sie benutzt, da ich das Dreieck des Schicksals meide und scheinbar klaren und prägnanten Code bekomme. (Es macht das Nachdenken über die Ausführung viel einfacher).
Was ich nicht finden konnte, ist: Wann verwenden Sie NICHT Versprechungen? Wann vermeide ich es, sie zu benutzen?
Aktualisierung:
Während ich einige großartige Punkte wie API-Konsistenz gesehen habe, muss ich noch einen soliden NO-Fall finden. Die Antwort von Lux schlägt vor, dass Operationen, die Ereignisemitter abrufen, sie vermeiden sollten, da wiederkehrende Rückrufe nicht mit Versprechen vereinbar sind. Ich habe jedoch das Gefühl, dass die Antwort noch in der Substanz fehlt, um es (jetzt) zu überprüfen.
Einige Faustregeln:
Wenn Ihre Methode synchron sein kann (einfache Datenumwandlung), verwenden Sie in dieser Methode synchronen Code.
Wenn die Methode jedoch synchron manchmal und asynchron manchmal sein kann (mehrere Codepfade basierend auf dem internen oder externen Status), sollte sie asynchron immer . Andernfalls können unerwartete kleine Diskrepanzen auftreten, wenn sich Ihr Code in komplexen Szenarios verhält. Daher sollten Sie die beiden Einstellungen nicht mischen.
[Bearbeiten] Wie bereits im Kommentar erwähnt, sollten Sie, wenn Ihre Methode momentan synchron ist, aber fest davon überzeugt ist, dass sie zu einem späteren Zeitpunkt möglicherweise asynchrone Arbeiten ausführen muss, die Versprechen von Anfang an verwenden, um kostspieliges Refactoring zu vermeiden .
Im Allgemeinen sollte Ihre API konsistent sein. Daher empfiehlt es sich, entweder Versprechungen überall oder Callbacks überall zu verwenden. Dadurch wird es einfacher, über den Code nachzudenken.
Wenn Sie Ultra-High-Performance-Code schreiben und / oder wenig Speicherbedarf haben, sollten Sie keine Versprechen, sondern Callbacks verwenden oder eine Versprechens-Bibliothek mit dem Schwerpunkt auf Leistung verwenden, wie bluebird , anstelle der systemeigenen Promise-Implementierung / des allgemeinen Anwendungsfalls polyfill.
[edit] Wie auch immer, neue Erweiterungen der Web-Plattform, wie global fetch -Funktion, gib ein Promise
zurück, und es scheint, dass in den kommenden Jahren immer mehr Browser-Builts auf Versprechungen basieren werden. Also, wenn Sie bereit sind, modernen Code zu schreiben, werden Sie Versprechen nicht entgehen.
Sie verwenden Versprechen für einmalige asynchrone Vorgänge. Initiieren Sie den Vorgang, führen Sie den Vorgang aus, benachrichtigen Sie einen Anrufer über die Beendigung oder die Ergebnisse oder den Fehler, und machen Sie es dann endgültig.
Die Situationen, in denen Sie keine Versprechen verwenden sind anders als oben beschrieben:
Meistens sind Versprechungen gewöhnt, mit asihnronnous Aufgaben einfach zu arbeiten. Manchmal machen wir absichtlich einige Dinge asynchron, um eine Überlastung des Threads, mit dem wir arbeiten, zu vermeiden. Wir haben nur einen Thread pro Tab. Keine Notwendigkeit, Versprechungen zu verwenden, wenn Dinge klein sind oder Dinge, die mit WebWorker gemacht werden können.
Tags und Links javascript node.js promise es6-promise