【发布时间】:2018-07-15 18:55:42
【问题描述】:
MDN documentation 声明
当调用异步函数时,它会返回一个 Promise。当异步 函数返回一个值,Promise 将被解析为 返回值。当异步函数抛出异常或某些 值,Promise 将被抛出的值拒绝。
因此,考虑到 await 期望得到已解决的承诺,我做错了什么?
foo();
async function foo(){
await bar();
zoo();
}
async function bar(){
setTimeout(() => {
console.log("bar");
return;
}, 1000);
}
function zoo(){
console.log("zoo");
}
根据我(错误地)理解,它应该首先记录bar,然后是zoo,但它正在以相反的方式记录。
编辑:现在,感谢@Matt Morgan 的澄清,我理解了这个错误,因为bar() 函数返回undefined。尽管如此,我认为单独调用 async 函数 per se 会使该函数立即返回一个未解决的承诺,并且当 async 函数返回任何值时,这样的承诺将被解决(甚至不明确的)。但我现在意识到一个人真的需要通过return Promise 声明来回报自己的承诺。我认为 async 的 MDN 文章(我已全部阅读)在这个主题上有点混乱(只是我的看法)。
因此,我可以简单地将我的 bar() 函数修改为:
function bar(){
return new Promise(function(resolve){
setTimeout(() => {
console.log("bar");
resolve();
}, 1000);
});
}
【问题讨论】:
-
在您刚刚发布的链接中,查看
resolveAfter2Seconds的代码,然后将其与您的 bar() 进行比较。注意到什么了吗? -
@Will,我阅读了所有文章和示例,但我不明白如果异步函数已经通过简单地运行 @987654337 返回了
Promise,为什么还需要返回Promise@。文档说“当调用异步函数时,它返回一个 Promise。当异步函数返回一个值时,Promise 将使用返回的值解析” -
@Will 因此“我知道如何让它工作”,我只是不明白为什么它会那样工作
:) -
有趣。返回值会自动包装在 Promise 中。这肯定会减少样板。整洁。
-
1)
return不跨越函数边界。您只在回调内部返回。该函数将返回给它的调用者。但是你不是回调的调用者,浏览器会在超时时调用该函数。对setTimeout的调用会立即返回。它没有阻塞。 2) 如果你显式地创建并返回一个 Promise,那么你就不需要 async。如果您希望能够在函数中使用 await,则需要 async。
标签: javascript async-await ecmascript-2017