【发布时间】:2016-05-20 01:13:26
【问题描述】:
我读到async 关键字标记的异步函数隐式返回一个承诺:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
但这不连贯……假设doSomethingAsync()返回一个promise,await关键字将返回promise的值,而不是promise itef,那么我的getVal函数应该返回价值,而不是隐含的承诺。
那么究竟是什么情况呢?由 async 关键字标记的函数是隐式返回 Promise 还是我们控制它们返回的内容?
也许如果我们不显式地返回某些东西,那么它们会隐式地返回一个承诺......?
说清楚一点,上面和
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。
【问题讨论】:
-
console.log显示什么? -
这是 promise resolve 函数传递的值,而不是 promise 本身
-
也许 await 会解开 promise 的结果。
-
JavaScript 的承诺试图模仿 c# 的异步等待行为。然而,历史上有很多结构可以用 c# 来支持它,而在 JavaScript 中则没有。因此,虽然在许多用例中它可能看起来非常相似,但它有点用词不当。
-
是的,这是正确的,只是有点令人困惑,因为它是隐含的......也就是即使没有 return 语句它仍然返回一个承诺......看到了吗?
标签: javascript node.js async-await ecmascript-next