Wie konvertiere ich eine vorhandene Callback-API in Versprechen?
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"?
InformationsquelleAutor der Frage 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 sollte nie werfenzurü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, die 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
.InformationsquelleAutor der Antwort Benjamin Gruenbaum
Heute, kann ich
Promise
imNode.js
als eine einfache Javascript-Methode.Ein einfaches und grundlegendes Beispiel zu
Promise
(mit KUSS 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
.Hoffe, das hilft.
InformationsquelleAutor der Antwort efkan
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:InformationsquelleAutor der Antwort Leo
Vor der Konvertierung eine Funktion als Versprechen In Node.JS
Nach Dem Umwandeln
Incase Sie brauchen, um mehrere Anfrage
InformationsquelleAutor der Antwort sivashanmugam kannan
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
.InformationsquelleAutor der Antwort Bruno
Können Sie JavaScript native verspricht mit Node-JS.
Mein Cloud-9-code-link: https://ide.c9.io/adx2803/native-promises-in-node
InformationsquelleAutor der Antwort Apoorv
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
InformationsquelleAutor der Antwort Gian Marco Gherardi
Die F-Bibliothek mit kriskowal enthält callback-Funktionen Versprechen.
Eine Methode wie diese:
umgewandelt werden kann, mit f: ninvoke
InformationsquelleAutor der Antwort Jason Loveman
Unter Knoten v7.6+, die eingebaute verspricht und async:
Wie zu verwenden:
InformationsquelleAutor der Antwort 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 der Antwort user1852503
Mit plain old vanilla javaScript, hier eine Lösung zu promisify eine api-callback.
InformationsquelleAutor der Antwort daviddavis
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 der Antwort Nicolas Zozol
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 der Antwort Do Async
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 der Antwort JITuan LIn
es6-promisify
wandelt callback-Funktionen zu Versprechen-basierte Funktionen.Ref: https://www.npmjs.com/package/es6-promisify
InformationsquelleAutor der Antwort Pujan Srivastava
Können Sie callback2Promise npm-Paket zu konvertieren, Knoten-Stil-Funktionen Verspricht.`
InformationsquelleAutor der Antwort kutlu