【问题标题】:Why does babel translate async/await to regenerators?为什么 babel 将 async/await 翻译成再生器?
【发布时间】:2016-04-09 12:47:15
【问题描述】:

所有版本的 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 语句。

【问题讨论】:

    标签: javascript babeljs ecmascript-harmony


    【解决方案1】:

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

    还有一个名为kneden 的实验性插件,它会尝试按照您的建议进行操作(异步到承诺)。它仍然是 WIP,并不能涵盖所有情况,而且很可能无法解决。

    【讨论】:

      【解决方案2】:

      我认为你忽略了循环:

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

      【讨论】:

      • 谢谢,经过一些研究,我发现循环和条件可以正确处理但确实很难,所有这些复杂性的混合可能是不支持将 await 直接转换为 Promise 的原因
      猜你喜欢
      • 2019-01-26
      • 2017-05-30
      • 2014-04-17
      • 2017-07-20
      • 2017-10-26
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多