为什么babel将async/await转换为再生器

Why does babel translate async/await to regenerators?

本文关键字:转换 再生器 await babel async 为什么      更新时间:2024-03-21

所有版本的babel都将await语句转换为_asyncToGenerator调用,它显然有一些缺点:

  1. 代码大小急剧增长
  2. 需要regeneratorRuntime

根据我对语法的理解,我认为任何await都应该等效于Promise#then调用,因此下面的代码:

try {
    let user = await getUser();
    console.log(user.name);
}
catch (error) {
    console.error(error);
}

相当于:

let promise$of$getUser$ = getUser();
$promise$of$getUser$.then(
    $result$ => console.log($result$),
    $error$ => console.error($error$)
);

通过这种方式,还可以正确地将多个await语句,甚至是Promise#thenawait语句的混合映射到Promise链,因此我必须错过一些纯Promise#then不适合await语句的情况。

您可以使用其他两个插件:async to generator和async to module方法。

还有一个名为kneden的实验插件,它确实尝试按照你的建议进行(async to promise)。它仍然是在制品,并不能解释所有情况,很可能无法解释。

我认为您忽略了循环:

for (let userId of userIds) {
  const user = await getUser(userId);
  console.log(user);
}