J'ai lu que les fonctions asynchrones marquées par le async
mot - clé renvoient implicitement une promesse:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
mais ce n'est pas cohérent ... en supposant que doSomethingAsync()
retourne une promesse, et le mot clé await retournera la valeur de la promesse, pas la promesse itsef, alors ma fonction getVal devrait renvoyer cette valeur, pas une promesse implicite.
Alors, quel est exactement le cas? Les fonctions marquées par le mot clé async renvoient-elles implicitement des promesses ou contrôlons-nous ce qu'elles renvoient?
Peut-être que si nous ne renvoyons pas explicitement quelque chose, alors ils renvoient implicitement une promesse ...?
Pour être plus clair, il y a une différence entre ce qui précède et
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
Dans mon synopsis, le comportement est en effet incompatible avec les déclarations de retour traditionnelles. Il semble que lorsque vous retournez explicitement une valeur non prometteuse à partir d'une async
fonction, cela forcera son encapsulation dans une promesse. Je n'ai pas de gros problème avec ça, mais ça défie le JS normal.
la source
console.log
montre-t-il?Réponses:
La valeur de retour sera toujours une promesse. Si vous ne retournez pas explicitement une promesse, la valeur que vous renvoyez sera automatiquement enveloppée dans une promesse.
Même chose même s'il y a un fichier
await
.Les promesses se déroulent automatiquement, donc si vous retournez une promesse pour une valeur à partir d'une
async
fonction, vous recevrez une promesse pour la valeur (pas une promesse pour une promesse pour la valeur).ES6 a des fonctions qui ne renvoient pas exactement la même valeur que le
return
. Ces fonctions sont appelées générateurs.la source
J'ai jeté un coup d'œil aux spécifications et j'ai trouvé les informations suivantes. La version courte est qu'un
async function
desugars à un générateur qui donnePromise
s. Donc, oui, les fonctions asynchrones renvoient des promesses .Selon la spécification tc39 , ce qui suit est vrai:
Desugars à:
Où
spawn
"est un appel à l'algorithme suivant":la source
async function
avecasync function*
. Le premier retourne simplement une promesse. Ce dernier renvoie un générateur qui donne des promesses.Ajoutez simplement wait avant votre fonction lorsque vous l'appelez:
la source
async ne renvoie pas la promesse, le mot-clé await attend la résolution de la promesse. async est une fonction de générateur améliorée et await fonctionne un peu comme yield
Je pense que la syntaxe (je ne suis pas sûr à 100%) est
async function* getVal() {...}
Les fonctions du générateur ES2016 fonctionnent un peu comme ça. J'ai créé un gestionnaire de base de données basé sur le plus fastidieux que vous programmez comme ceci
Remarquez comment je le programme simplement comme synchrone normal, en particulier à
yield connection.execSql
et àyield connection.callProcedure
La fonction db.exec est un générateur assez typique basé sur Promise
la source