Li que as funções assíncronas marcadas pela async
palavra - chave retornam implicitamente uma promessa:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
mas isso não é coerente ... supondo que doSomethingAsync()
retorne uma promessa, e a palavra-chave await retornará o valor da promessa, não a promessa em si, então minha função getVal deve retornar esse valor, não uma promessa implícita.
Então, qual é exatamente o caso? As funções marcadas pela palavra-chave async retornam promessas implicitamente ou nós controlamos o que elas retornam?
Talvez, se não retornarmos algo explicitamente, eles retornem implicitamente uma promessa ...?
Para ser mais claro, há uma diferença entre o acima e
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
Na minha sinopse, o comportamento é de fato inconsistente com as declarações de retorno tradicionais. Parece que quando você retorna explicitamente um valor não prometido de uma async
função, ele forçará o agrupamento em uma promessa. Eu não tenho um grande problema com isso, mas desafia o JS normal.
fonte
console.log
mostra?Respostas:
O valor de retorno sempre será uma promessa. Se você não retornar uma promessa explicitamente, o valor retornado será automaticamente incluído em uma promessa.
A mesma coisa, mesmo se houver um
await
.As promessas são desembrulhadas automaticamente, portanto, se você retornar uma promessa para um valor de dentro de uma
async
função, receberá uma promessa para o valor (não uma promessa para uma promessa para o valor).ES6 tem funções que não retornam exatamente o mesmo valor que o
return
. Essas funções são chamadas de geradores.fonte
Dei uma olhada nas especificações e encontrei as seguintes informações. A versão curta é que um
async function
desugars para um gerador que produzPromise
s. Portanto, sim, as funções assíncronas retornam promessas .De acordo com a especificação tc39 , o seguinte é verdadeiro:
Desugars para:
Onde
spawn
"é uma chamada para o seguinte algoritmo":fonte
async function
comasync function*
. O primeiro simplesmente retorna uma promessa. O último retorna um gerador que rende promessas.Basta adicionar await antes de sua função ao chamá-la:
fonte
async não retorna a promessa, a palavra-chave await aguarda a resolução da promessa. async é uma função de gerador aprimorada e await funciona um pouco como o rendimento
Acho que a sintaxe (não tenho 100% de certeza) é
async function* getVal() {...}
As funções do gerador ES2016 funcionam um pouco assim. Eu fiz um gerenciador de banco de dados baseado no entediante que você programa assim
Observe como eu apenas o programo como síncrono normal, especialmente em
yield connection.execSql
e emyield connection.callProcedure
A função db.exec é um gerador baseado em Promise bastante típico
fonte