Wie konvertiere ich eine vorhandene callback-API verspricht?
Will ich arbeiten, mit dem Versprechen aber ich habe ein callback-API in einem format wie diesem:
1. DOM-laden, der eine oder andere Zeit-Ereignis:
window.onload; //set to callback
...
window.onload = function() {
};
2. Plain callback:
function request(onChangeHandler) {
...
}
request(function() {
//change happened
...
});
3. Knoten-Stil callback ("nodeback"):
function getStuff(dat, callback) {
...
}
getStuff("dataParam", function(err, data) {
...
})
4. Eine ganze Bibliothek mit Knoten-Stil-Rückrufe:
API;
API.one(function(err, data) {
API.two(function(err, data2) {
API.three(function(err, data3) {
...
});
});
});
Wie arbeite ich mit der API in Versprechungen, wie kann ich "promisify"?
Ich habe meine eigene Antwort, sondern Antworten erweitern, wie dies für eine bestimmte Bibliothek oder in mehr Umstände und Bearbeitungen sind auch sehr willkommen.
Das ist eine interessante Idee, die ich habe versucht, eine Allgemeine Antwort, die verwendet zwei gängige Ansätze (Versprechen Konstruktor und deferred-Objekt). Ich versuchte die beiden alternativen Antworten. Ich bin damit einverstanden, dass RTFMing löst dieses Problem, aber wir laufen in dieses Problem oft hier und im bug-tracker, so dass ich dachte, eine 'kanonische Frage' ist vorhanden - ich denke, RTFMing löst über 50% der Themen in der JS-tag :D, Wenn Sie einen interessanten Einblick dazu beitragen, eine Antwort oder Bearbeiten, es wäre sehr geschätzt.
Nicht die Schaffung eines
Nein, es ist nicht eine gute Idee, um wrap-synchrone Aufrufe mit dem Versprechen - nur asynchrone Aufrufe durchführen können I/O
Das ist eine interessante Idee, die ich habe versucht, eine Allgemeine Antwort, die verwendet zwei gängige Ansätze (Versprechen Konstruktor und deferred-Objekt). Ich versuchte die beiden alternativen Antworten. Ich bin damit einverstanden, dass RTFMing löst dieses Problem, aber wir laufen in dieses Problem oft hier und im bug-tracker, so dass ich dachte, eine 'kanonische Frage' ist vorhanden - ich denke, RTFMing löst über 50% der Themen in der JS-tag :D, Wenn Sie einen interessanten Einblick dazu beitragen, eine Antwort oder Bearbeiten, es wäre sehr geschätzt.
Nicht die Schaffung eines
new Promise
hinzufügen keine signifikante overhead? Ich bin zu wollen, wickeln Sie alle meine synchron Noje.js Funktionen in ein Versprechen, so entfernen Sie alle synchronous code von meinem Knoten app, aber ist dies beste Praxis? In anderen Worten, eine Funktion akzeptiert eine statische argument(z.B. eine Zeichenkette) und gibt ein Ergebnis der Berechnung, sollte ich wickeln, dass in einem Versprechen? ...Ich habe irgendwo gelesen, dass Sie sollten nicht jede synchronous code in Nodejs.Nein, es ist nicht eine gute Idee, um wrap-synchrone Aufrufe mit dem Versprechen - nur asynchrone Aufrufe durchführen können I/O
InformationsquelleAutor Benjamin Gruenbaum | 2014-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verspricht einen Status haben, beginnen Sie als angemeldet und können abgerechnet werden:
Versprechen der Rückkehr Funktionen werfen, zurückkehren sollten Ablehnungen statt. Das werfen von ein Versprechen der Rückkehr-Funktion wird Sie zwingen, ein
} catch {
und eine.catch
. Menschen mit promisified APIs erwarten Sie nicht, Versprechungen zu werfen. Wenn Sie nicht sicher sind, wie Sie asynchrone APIs funktionieren in JS - bitte Lesen Sie diese Antwort ersten.1. DOM-laden, der eine oder andere Zeit-Ereignis:
So, erstellen verspricht in der Regel bedeutet, dass Sie angeben, wenn Sie sich niederlassen - das bedeutet, dass, wenn Sie sich bewegen, die erfüllt oder zurückgewiesen phase zeigen die Daten zur Verfügung stehen (und kann zugegriffen werden mit
.then
).Mit modernen Versprechen Implementierungen unterstützen
Promise
Konstruktor wie native ES6 promises:Würden Sie verwenden Sie dann die resultierende Versprechen, wie so:
Mit Bibliotheken, die Unterstützung der latenten (wir verwenden $q für dieses Beispiel hier, aber wir verwenden auch jQuery später):
Oder mit einem jQuery-wie-API hooking auf ein Ereignis geschieht einmal:
2. Plain callback:
Diese APIs sind Recht Häufig, da so gut... Rückrufe sind Häufig in JS. Betrachten wir den Allgemeinen Fall mit
onSuccess
undonFail
:Mit modernen Versprechen Implementierungen unterstützen
Promise
Konstruktor wie native ES6 promises:Mit Bibliotheken, die Unterstützung der latenten (wir verwenden jQuery für dieses Beispiel hier, aber die haben wir auch benutzt $q oben):
jQuery bietet auch eine
$.Deferred(fn)
form, das hat den Vorteil, dass Sie uns um eine expression zu schreiben, die emuliert sehr eng an dienew Promise(fn)
form wie folgt:Hinweis: Hier nutzen wir die Tatsache, dass ein jQuery deferred s
resolve
undreject
Methoden sind "abnehmbar"; dh. Sie sind verpflichtet, die Instanz jQuery.Latente(). Nicht alle libs die dieses feature bieten.3. Knoten-Stil callback ("nodeback"):
Knoten Stil Rückrufe (nodebacks) haben ein bestimmtes format, in denen das Rückrufen ist immer das Letzte argument und seine erste parameter ist ein Fehler. Lassen Sie uns zuerst promisify manuell:
:
Mit deferreds können Sie Folgendes tun (wir verwenden Q für dieses Beispiel, obwohl die Q jetzt unterstützt die neue syntax was Sie bevorzugen sollten):
In der Regel sollten Sie nicht promisify Dinge manuell zu viel, die meisten Versprechen Bibliotheken, die entworfen wurden, mit Knoten im Kopf-als auch native verspricht in Knoten 8+ über eine integrierte Methode für promisifying nodebacks. Zum Beispiel
4. Eine ganze Bibliothek mit Knoten-Stil-Rückrufe:
Gibt es keine goldene Regel hier, Sie promisify Sie eins nach dem anderen. Jedoch, einige Versprechen Implementierungen erlauben Sie, dies zu tun in der Masse, zum Beispiel in Bluebird, Umwandlung einer nodeback-API, um ein Versprechen API ist so einfach wie:
Oder mit native verspricht in Knoten:
Hinweise:
.then
- handler, die Sie nicht brauchen, um promisify Dinge. Rückkehr ein Versprechen von einem.then
handler zu beheben oder abzulehnen, die Versprechen, den Wert. Das werfen von einem.then
handler ist auch eine gute übung und lehnt das Versprechen - das ist das berühmte Versprechen Sicherheit werfen.onload
Fall sollten SieaddEventListener
eher alsonX
.es wurde abgelehnt, da ich nicht sehen und akzeptieren es in der Zeit. Für was es Wert ich glaube nicht, dass der Zusatz ist auch relevant, obwohl nützlich.
Benjamin, ob oder nicht
resolve()
undreject()
geschrieben werden wiederverwendbare, ich wage zu behaupten, dass meine Vorschläge Bearbeiten ist relevant, denn es bietet ein jQuery-Beispiel für die form$.Deferred(fn)
, die sonst fehlt. Wenn nur ein jQuery-Beispiel enthalten ist, dann schlage ich vor, dass es sein sollte in dieser form eher alsvar d = $.Deferred();
etc. als Menschen sollten ermutigt werden, zu verwenden, die oft vernachlässigt$.Deferred(fn)
form plus, eine Antwort wie diese, es setzt jQuery mehr auf einer Stufe mit den libs, die mit dem Enthüllt-Konstruktor-Muster.Heh, zu 100% fair-ich wusste nicht, jQuery lassen Sie
$.Deferred(fn)
, wenn Sie Sie Bearbeiten, in der statt des vorhandenen Beispiel in den nächsten 15 Minuten, ich bin sicher, ich kann versuchen, Sie zu genehmigen, Sie auf die Zeit 🙂Dies ist eine große Antwort. Möchten Sie vielleicht, um es zu aktualisieren, indem Sie erwähnte auch
util.promisify
, dass Node.js wird, um zu seiner Kern-ausgehend von der RC-Version 8.0.0. Seine Arbeit ist es nicht viel anders aus als BluebirdPromise.promisify
, hat aber den Vorteil, dass keine zusätzliche Abhängigkeiten, in Fall, dass Sie wollen einfach nur native Versprechen. Ich habe geschrieben, einen blog-post über util.promisify für alle, die mehr zum Thema Lesen.InformationsquelleAutor Benjamin Gruenbaum
Heute, kann ich
Promise
imNode.js
als eine einfache Javascript-Methode.Ein einfaches und grundlegendes Beispiel zu
Promise
(mit KISS Weg):Plain Javascript Async-API-code:
Promise
Javascript Async-API-code:(Ich empfehle den Besuch diese schöne Quelle)
Auch
Promise
kann verwendet werden, zusammen mitasync\await
imES7
um das Programm auf flow wartenfullfiled
Ergebnis wie folgt aus:Anderen Anwendung mit dem gleichen code, indem
.then()
MethodePromise
können auch verwendet werden, auf jeder Plattform, basiert auf Node.js wiereact-native
.Bonus: Ein hybrid Methode
(Die callback-Methode wird angenommen, dass zwei Parameter als Fehler und Ergebnis)
Der oben beschriebenen Methode können Antworten Ergebnis für old fashion-Rückruf und Versprechen Verwendungen.
Hoffe, das hilft.
InformationsquelleAutor efkan
Vor der Konvertierung eine Funktion als Versprechen In Node.JS
Nach Dem Umwandeln
Incase Sie brauchen, um mehrere Anfrage
InformationsquelleAutor Sivashanmugam Kannan
Ich glaube nicht, dass die
window.onload
Vorschlag von @Benjamin wird die ganze Zeit arbeiten, da Sie nicht erkennen, ob er aufgerufen wird, nachdem die Last. Ich habe gebissen, dass viele Male. Hier ist eine version, die sollte immer funktionieren:setTimeout(resolve, 0)
(odersetImmediate
wenn verfügbar), um sicherzustellen, dass es asynchron aufgerufen wird?Aufruf
resolve
synchron in Ordnung ist. Das Versprechen istthen
Handler garantiert das framework asynchron aufgerufen werden, unabhängig davon, obresolve
wird synchron aufgerufen.InformationsquelleAutor Leo
Im release candidate für Node.js 8.0.0, es ist ein neues Dienstprogramm,
util.promisify
(ich habe darüber geschrieben util.promisify), kapselt die Kapazität der promisifying, was Funktion.Ist es nicht viel anders aus, die Ansätze vorgeschlagen, die in den anderen Antworten, aber hat den Vorteil, dass Sie eine Kern-Methode und benötigt keine zusätzlichen Abhängigkeiten.
Dann haben Sie eine
readFile
Methode gibt eine nativePromise
.util.promisify
zweimal (zurück im Jahr 2014, wenn diese Frage geschrieben wurde, und vor ein paar Monaten, die ich gedrückt wie ein core-Mitglied der Knoten und ist die aktuelle version, die wir in Knoten). Denn es ist noch nicht öffentlich zugänglich - ich habe nicht fügen Sie es zu dieser Antwort noch. Wir würden sehr dankbar Gebrauch feedback, obwohl und immer zu wissen, was einige Fallstricke sind, um bessere Dokumente für die Veröffentlichung 🙂Zusätzlich könnten Sie über die custom flag für promisifying mit
util.promisify
in Ihrem blog-post 🙂Meinst du die Tatsache, dass mit der
util.promisify.custom
symbol ist es möglich, zu überschreiben, das Ergebnis util.promisify? Um ehrlich zu sein, dies war eine vorsätzliche miss, denn ich bin noch nicht in der Lage zu finden eine nützliche Verwendung. Vielleicht können Sie mir einige inputs?Sicher, betrachten APIs wie
fs.exists
oder APIs, die sich nicht an die Knoten-Konvention - ein bluebirdPromise.promisify
würde Sie bekommen, falsch ist, aberutil.promisify
bekommt Sie Recht.InformationsquelleAutor Bruno
Node.js 8.0.0 umfasst neue
util.promisify()
API, mit standard Node.js callback-style APIs verpackt in einer Funktion, die eine Zusage zurückgibt. Ein Beispiel für die Verwendung vonutil.promisify()
ist unten dargestellt.Sehen Verbesserte Unterstützung für Verspricht
Nur weil diese version von node ist jetzt freigegeben, und ich habe berichtet, "offizielle" feature-Beschreibung und der link.
InformationsquelleAutor Gian Marco Gherardi
Können Sie JavaScript native verspricht mit Node-JS.
Mein Cloud-9-code-link: https://ide.c9.io/adx2803/native-promises-in-node
InformationsquelleAutor Apoorv
Die F-Bibliothek mit kriskowal enthält callback-Funktionen Versprechen.
Eine Methode wie diese:
umgewandelt werden kann, mit f: ninvoke
Q.denodeify
. Wir müssen betonen, Bibliothek Helfer?ich fand dies sinnvoll, da eine google über promisifying in Q führt hier
InformationsquelleAutor Jason Loveman
Unter Knoten v7.6+, die eingebaute verspricht und async:
Wie zu verwenden:
InformationsquelleAutor Paul Spaulding
Wenn Sie ein paar Funktionen, die eine callback-und Sie wollen Ihnen die Rückkehr ein Versprechen, sondern Sie können diese Funktion verwenden, um die Konvertierung zu tun.
InformationsquelleAutor user1852503
Mit plain old vanilla javaScript, hier eine Lösung zu promisify eine api-callback.
InformationsquelleAutor daviddavis
In Node.js 8 Sie können promisify Objekt-Methoden on-the-fly Verwendung dieses npm-Modul:
https://www.npmjs.com/package/doasync
Es nutzt util.promisify und Proxies so, dass Ihr die Objekte unverändert bleiben. Memoization ist auch fertig mit der Verwendung von WeakMaps). Hier sind einige Beispiele:
Mit Objekten:
Funktionen:
Können Sie sogar native
call
undapply
zu binden, etwas Kontext:InformationsquelleAutor Do Async
Können Sie native Versprechen in ES6, zum Beispiel der Umgang mit setTimeout:
In diesem Beispiel, das Versprechen hat keinen Grund zu scheitern, so
reject()
wird nie aufgerufen.InformationsquelleAutor Nicolas Zozol
Den callback-Stil Funktion immer so(fast alle Funktion in node.js ist dieser Stil):
Dieser Stil hat die gleiche Funktion:
die callback-Funktion übergeben wird, durch das Letzte argument.
die callback-Funktion, die nehmen immer den Fehler Objekt als erstes argument.
So, könnten Sie eine Funktion schreiben, die für konvertieren eine Funktion, mit diesem Stil wie diese:
Weitere prägnante Beispiel oben verwendet ramda.js. Ramda.js ist eine ausgezeichnete Bibliothek, für die funktionale Programmierung. Im obigen code wir verwendet, es ist gelten(wie javascript
function.prototype.apply
) und append(wie javascriptfunction.prototype.push
).So konnten wir konvertieren die eine callback-style-Funktion zu Versprechen Stil Funktion:
toPromise und checkErr Funktion ist von Berserker Bibliothek, es ist ein funktionaler Programmierung Bibliothek Gabel durch ramda.js(erstellt von mir).
Hoffe, diese Antwort ist für Sie nützlich.
InformationsquelleAutor JITuan LIn
Können Sie so etwas tun
Dann verwenden Sie es
InformationsquelleAutor onmyway133
es6-promisify
wandelt callback-Funktionen zu Versprechen-basierte Funktionen.Ref: https://www.npmjs.com/package/es6-promisify
InformationsquelleAutor Pujan Srivastava
Es ist wie 5 Jahre zu spät, aber ich wollte den post hier meine promesify version holt Funktionen aus der API callbacks und verwandelt Sie in verspricht
Werfen Sie einen Blick auf diese sehr einfache version hier:
https://gist.github.com/jdtorregrosas/aeee96dd07558a5d18db1ff02f31e21a
InformationsquelleAutor Julian Torregrosa