【发布时间】:2021-10-03 09:47:35
【问题描述】:
刚刚浏览了这个tutorial,我很困惑为什么await 只在async 函数中有效。
来自教程:
如前所述,await 仅适用于异步函数。
据我了解,async将函数返回对象包装成一个Promise,所以调用者可以使用.then()
async function f() {
return 1;
}
f().then(alert); // 1
而await 只是等待承诺在async 函数中解决。
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 1000)
});
let result = await promise; // wait till the promise resolves (*)
alert(result); // "done!"
}
f();
在我看来它们的用法不相关,有人可以解释一下吗?
【问题讨论】:
-
这就是该功能的设计方式。将函数标记为
async的唯一原因是因为它在其中使用了await。回想一下,该语言必须继续完全正常地使用 2003 年编写的代码。 -
您对
async所做的事情的猜测并不正确。调用者也可以自己使用await。基本上,async和await提供了一种完全重新设计显式 Promise 使用模式的方法。 -
当
f()返回result时会发生什么?调用函数将立即获得一个返回值——它不知道您在f()中使用await。使用异步函数,返回将是一个承诺。 -
从 c# 复制粘贴。异步/承诺上的语法糖涂层。当我第一次看到它时,我的疑惑是一样的。
-
就 OP 而言,
async似乎是多余的,解析器可以在没有人工的情况下将函数标记为异步(如果有await),但也许这很慢或不支持 @ 987654342@ 或有些人有其他问题。
标签: javascript asynchronous async-await