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

时间:2016-04-09 12:47:15

标签: javascript babeljs ecmascript-harmony

所有版本的babel将await语句翻译为_asyncToGenerator来电,显然有一些缺点:

  1. 代码大小急剧增长
  2. 需要regeneratorRuntime
  3. 根据我对语法的理解,我认为任何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语句。

2 个答案:

答案 0 :(得分:1)

您可以使用其他2个插件:async-to-generatorasync-to-module-method

还有一个名为kneden的实验性插件,它确实尝试做你所建议的(异步承诺)。它仍然是WIP,并不考虑所有情况,很可能无法解决。

答案 1 :(得分:1)

我认为你忽略了循环:

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