I read that async functions marked by the async
keyword implicitly return a promise:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
but that is not coherent...assuming doSomethingAsync()
returns a promise, and the await keyword will return the value from the promise, not the promise itsef, then my getVal function should return that value, not an implicit promise.
So what exactly is the case? Do functions marked by the async keyword implicitly return promises or do we control what they return?
Perhaps if we don't explicitly return something, then they implicitly return a promise...?
To be more clear, there is a difference between the above and
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 my synopsis the behavior is indeed inconsistent with traditional return statements. It appears that when you explicitly return a non-promise value from an async
function, it will force wrap it in a promise.
I don't have a big problem with it, but it does defy normal JS.
console.log
show? – GintzgetVal
functions you return a non-promise and you log a promise. They behave the same way. – Manilleasync function getVal(){ return await doSomethingAync() }
you basically dofunction getVal(){ return Promise.resolve(Promise.resolve(doSomethingAync())) }
one from thereturn
, and one from theawait
. – Centigram