这个问题在这里已经有了答案:
Why do I have to put async keyword to functions which have await keywords?
(1 个回答)
JS async/await - why does await need async?
(3 个回答)
Why 'await' requires 'async' in function definition
(4 个回答)
Nodejs why is await only restricted to async functions?
(3 个回答)
ES2017 - Async vs. Yield
(4 个回答)
去年关闭。
必须使用 异步 包含函数上的关键字以使用 等待在函数体内。
async function fetchMovies() {
const response = await fetch('/movies');
console.log(response);
}
fetchMovies();
等待用于在异步 完成时阻塞取() 称呼。从代码中可以看出,函数取电影() 甚至没有返回任何值。即使这样做了,它也会影响调用者使用返回值的方式,但是为什么它对从函数体调用另一个异步调用很重要呢?我的问题是为什么这是必需的吗?对此有什么好的解释吗?是否与的实际执行需要有关?等待并在较旧的 JavaScript 版本中支持它?
我知道菲菲使用模式可以使用等待但这是否会改变 之后的代码的语义?菲菲代码块以任何方式?
(async () => {
const response = await fetch('/movies');
console.log(response);
})();
我也知道顶级 等待在模块中得到支持。可能是我错过了一些非常明显的东西。
最佳答案
async
的三个原因关键字存在:
await
不是关键字。标记函数async
提供句法“救助”以指示函数体内语言语法的重大变化。这是最重要的原因。没有
async
关键字,所有用 ECMAScript 5 或更早版本编写的程序如果使用 await
将不再工作。关键字作为变量(实际上 this was done intentionally 在某些情况下作为 async
/await
标准化之前的 polyfill),因为这会导致不添加 async
的破坏性更改到规范。正因为如此, async
在语法上是必要的,以避免破坏语言 .这使得解析更加高效,这对 ECMAScript 实现者和开发人员都很有吸引力,尽管仅此原因并不能使
async
对语法严格必要。async
还对函数执行自己的转换,无论 await
是否关键字出现在正文中。考虑以下两个函数:
function foo() {
if (Math.random() < 0.5) {
return 'return';
} else {
throw 'throw';
}
}
async function bar() {
if (Math.random() < 0.5) {
return 'return';
} else {
throw 'throw';
}
}
async
执行 function bar()
的以下转换:function bar() {
return new Promise((resolve, reject) => {
try {
resolve((/*async function bar*/() => {
if (Math.random() < 0.5) {
return 'return';
} else {
throw 'throw';
}
})());
} catch (reason) {
reject(reason);
}
});
}
熟悉 Promise 的人会认识到,我们可以简化上述内容,因为 Promise 构造函数执行器函数会在同步抛出错误时隐式拒绝:function bar() {
return new Promise((resolve) => {
if (Math.random() < 0.5) {
return resolve('return');
} else {
throw 'throw';
}
});
}
关于javascript - 为什么在 JavaScript 函数体内调用 await 需要异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66113393/