Bei Verwendung eines einfachen Rückrufs wie im folgenden Beispiel:
test() {
api.on( 'someEvent', function( response ) {
return response;
});
}
Wie kann die Funktion geändert werden, um async / await zu verwenden? Unter der Annahme, dass 'someEvent' garantiert einmal und nur einmal aufgerufen wird, möchte ich, dass der Funktionstest eine asynchrone Funktion ist, die erst zurückkehrt, wenn der Rückruf ausgeführt wird, wie z.
async test() {
return await api.on( 'someEvent' );
}
Antworten:
async/await
ist keine Magie. Eine asynchrone Funktion ist eine Funktion, die Versprechen für Sie auspacken kann. Sie müssen alsoapi.on()
ein Versprechen zurückgeben, damit dies funktioniert. Etwas wie das:Dann
Aber das ist auch eine Lüge, denn asynchrone Funktionen geben auch Versprechen selbst zurück, sodass Sie nicht den Wert aus
test()
einem Versprechen herausholen, sondern ein Versprechen für einen Wert, den Sie wie folgt verwenden können:quelle
const apiOn = (event) => new Promise(resolve => api.on(event, resolve));
Es ist ärgerlich, dass es keine einfache Lösung gibt und das Wickeln
return new Promise(...)
schwierig ist, aber ich habe eine gute Umgehungsmöglichkeit gefundenutil.promisify
(tatsächlich macht es auch irgendwie das gleiche Wickeln, sieht einfach besser aus).Die obige Funktion gibt noch nichts zurück. Wir können dafür sorgen, dass es eines
Promise
der übergebenenresponse
zurückgibt,callback
indem wir Folgendes tun:Jetzt können wir tatsächlich
await
diecallback
.Einige Regeln bei der Verwendung
util.promisify
callback
muss das letzte Argument der Funktion sein, die es geben wirdpromisify
(err, res) => {...}
Lustige Sache ist, dass wir nie speziell schreiben müssen, was das
callback
eigentlich ist.quelle
Async / Warten ist Magie. Sie können eine Funktion erstellen
asPromise
, um diese Art von Situationen zu behandeln:und verwenden Sie es dann, wenn Sie möchten:
Die Anzahl der Argumente ist variabel.
quelle
Sie können dies ohne Rückrufe erreichen. Verwenden Sie hier das Versprechen async await anstelle von Rückrufen, wie ich dies tun würde. Und auch hier habe ich zwei Methoden zum Umgang mit Fehlern dargestellt
quelle