Ich habe gelesen, dass asynchrone Funktionen, die mit dem async
Schlüsselwort gekennzeichnet sind, implizit ein Versprechen zurückgeben:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
aber das ist nicht kohärent ... vorausgesetzt , doSomethingAsync()
kehrt ein Versprechen, und das await Schlüsselwort wird der Wert aus dem Versprechen , zurückzukehren, nicht das Versprechen ITSEF, dann meine getVal Funktion sollte diesen Wert zurückgeben, nicht eine implizite Versprechen.
Was genau ist also der Fall? Geben Funktionen, die mit dem Schlüsselwort async gekennzeichnet sind, implizit Versprechen zurück oder steuern wir, was sie zurückgeben?
Wenn wir etwas nicht explizit zurückgeben, geben sie vielleicht implizit ein Versprechen zurück ...?
Um klarer zu sein, gibt es einen Unterschied zwischen oben und
function doSomethingAync(charlie) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(charlie || 'yikes');
}, 100);
})
}
async function getVal(){
var val = await doSomethingAync(); // val is not a promise
console.log(val); // logs 'yikes' or whatever
return val; // but this returns a promise
}
var ret = getVal();
console.log(ret); //logs a promise
In meiner Zusammenfassung ist das Verhalten in der Tat nicht mit den traditionellen return-Anweisungen vereinbar. Wenn Sie einen Nicht-Versprechen-Wert explizit von einer async
Funktion zurückgeben, wird er anscheinend zwangsweise in ein Versprechen eingeschlossen. Ich habe kein großes Problem damit, aber es trotzt normalem JS.
quelle
console.log
zeigt?Antworten:
Der Rückgabewert wird immer ein Versprechen sein. Wenn Sie ein Versprechen nicht explizit zurückgeben, wird der von Ihnen zurückgegebene Wert automatisch in ein Versprechen eingeschlossen.
Das Gleiche, auch wenn es eine gibt
await
.Versprechen werden automatisch ausgepackt. Wenn Sie also innerhalb einer
async
Funktion ein Versprechen für einen Wert zurückgeben , erhalten Sie ein Versprechen für den Wert (kein Versprechen für ein Versprechen für den Wert).ES6 verfügt über Funktionen, die nicht genau den gleichen Wert wie das zurückgeben
return
. Diese Funktionen werden als Generatoren bezeichnet.quelle
Ich habe mir die Spezifikation angesehen und die folgenden Informationen gefunden. Die kurze Version ist, dass ein
async function
Desugar zu einem Generator, derPromise
s ergibt . Also, ja, asynchrone Funktionen geben Versprechen zurück .Gemäß der tc39-Spezifikation gilt Folgendes:
Desugars zu:
Wobei
spawn
"der folgende Algorithmus aufgerufen wird":quelle
async function
mitasync function*
. Ersteres gibt einfach ein Versprechen zurück. Letzterer gibt einen Generator zurück, der Versprechen gibt.Fügen Sie einfach wait vor Ihrer Funktion hinzu, wenn Sie sie aufrufen:
quelle
async gibt das Versprechen nicht zurück, das Schlüsselwort await wartet auf die Lösung des Versprechens. async ist eine erweiterte Generatorfunktion und das Warten funktioniert ein bisschen wie Yield
Ich denke, die Syntax (ich bin nicht 100% sicher) ist
async function* getVal() {...}
Die Generatorfunktionen des ES2016 funktionieren ein bisschen so. Ich habe einen Datenbank-Handler erstellt, der auf mühsam basiert und den Sie so programmieren
Beachten Sie, wie ich es gerade wie normal synchron programmiere, besonders bei
yield connection.execSql
und beiyield connection.callProcedure
Die Funktion db.exec ist ein ziemlich typischer Promise-basierter Generator
quelle