Leí que las funciones asíncronas marcadas por la async
palabra clave devuelven implícitamente una promesa:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
pero eso no es coherente ... asumiendo que doSomethingAsync()
devuelve una promesa, y la palabra clave await devolverá el valor de la promesa, no la promesa en sí, entonces mi función getVal debería devolver ese valor, no una promesa implícita.
Entonces, ¿cuál es exactamente el caso? ¿Las funciones marcadas por la palabra clave async devuelven promesas implícitamente o controlamos lo que devuelven?
¿Quizás si no devolvemos algo explícitamente, entonces devuelven implícitamente una promesa ...?
Para ser más claro, existe una diferencia entre lo anterior y
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
En mi sinopsis, el comportamiento es de hecho inconsistente con las declaraciones de devolución tradicionales. Parece que cuando devuelve explícitamente un valor no prometido de una async
función, lo forzará a envolverlo en una promesa. No tengo un gran problema con él, pero desafía al JS normal.
console.log
muestra?