我读到由 async
关键字标记的异步函数隐式返回一个承诺:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
但这不连贯……假设 doSomethingAsync()
返回一个承诺,并且 await 关键字将返回承诺的值,而不是承诺本身,那么我的 getVal 函数 应该 返回该值,而不是隐含的承诺.
那么到底是怎么回事呢?由 async 关键字标记的函数是隐式返回 promises 还是我们控制它们返回的内容?
也许如果我们没有明确地返回某些东西,那么他们会隐式地返回一个承诺……?
更清楚地说,上面和之间有区别
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
在我的概要中,这种行为确实与传统的返回语句不一致。似乎当您从 async
函数显式返回非承诺值时,它会强制将其包装在承诺中。我对它没有什么大问题,但它确实违背了普通的 JS。
原文由 Alexander Mills 发布,翻译遵循 CC BY-SA 4.0 许可协议
返回值永远是一个承诺。如果您没有显式返回一个承诺,您返回的值将自动包装在一个承诺中。
就算有去无回也一样! (返回
Promise { undefined }
)即使有
await
。Promises auto-unwrap,因此,如果您确实从
async
函数中返回一个值的 promise,您将收到该值的 promise(不是对该值的 promise 的 promise)。ES6 的函数不会返回与
return
完全相同的值。这些函数称为生成器。