【问题标题】:Migrating from Generators to Async/Await从生成器迁移到异步/等待
【发布时间】:2017-05-25 13:25:46
【问题描述】:

我刚刚痛苦地意识到生成器函数不能与 await 一起使用。只有 Promise 或异步函数。

我的团队构建了一个完整的应用程序,其中包含由生成器函数组成的所有模块,只需从主 js 文件调用 Co 模块。

除了检查数百个生成器函数并将它们从 function*(...){ 更改为 async function(...){ 之外,还有什么方法可以使生成器与 async/await 一起工作?

没有意义,因为 yield*/generators 和 async/await 在处理流程方面非常相似,所以我想知道他们是如何错过了 await 支持生成器的。

【问题讨论】:

  • 仅供参考,async/await 不是 ES7 的一部分。
  • 另外,如果您想重写大部分代码库,请考虑使用工具来完成,如果可能的话:github.com/facebook/jscodeshift(免责声明:我写的)
  • 迁移的原因是什么?
  • “我刚刚痛苦地意识到,生成器函数不能与 await 一起使用。只能使用 Promise 或异步函数。” 没有尝试过 async/await,尽管对其中的模式感到好奇使用了导致问题的发电机。您能否在问题中包含一个无法与async/await 一起使用的生成器函数的示例?
  • "没有意义,因为 yield*/generators 和 async/await 在处理流程方面非常相似" - 我不明白你的意思。它们可能相似,但这并不意味着它们可以组合成两者兼有的东西。

标签: javascript node.js ecmascript-6 ecmascript-2017


【解决方案1】:

您必须检查您的代码库并对其进行更改,是的(当然您可能会编写/使用为您完成所有工作的工具)。

但如果您愿意,您可以逐步执行此操作:将 function* 替换为 async function,将其中的每个 yield 替换为 await,将每个 yield* 替换为 await co(…),然后将每个调用更改为从 co(…)…() 的前生成器函数。

【讨论】:

    【解决方案2】:

    没有从一个迁移到另一个的冲动,因为async 函数和co library 可以和平共存。

    async 函数可以在 co 生成器函数中使用,它们只是返回承诺的函数:

    co.wrap(function* () {
        yield asyncFn(1);
    })()
    .catch(console.error);
    

    生成器函数可以在async函数内部使用:

    (async function () {
        await co(genFn(1));
        // for generator functions with no arguments, can also be 
        await co(genFn);
    })()
    .catch(console.error);
    

    除了检查数百个生成器函数并更改它们 从 function*(...){ 到 async function(...){,生成器还能如何 可以使用 async/await 吗?

    考虑到生成器在应用程序中仅与co 一起使用,因此可以自动替换它们。 function** 方法替换为 asyncyieldyield* 替换为 await

    在这之前,应该进行一些初步的重构。 this list of yieldables 只能使用 Promise 和生成器。并行执行(数组和对象)应替换为各自的Promise.all

    const results = yield [...];
    

    const results = yield Promise.all([...]);
    

    【讨论】:

    • “co”从何而来?
    • @delete 来自github.com/tj/co。我添加了答案的链接。猜猜这回答了你刚刚发布的问题。
    【解决方案3】:

    如果有人需要更多关于从 co 迁移到 async 函数的信息,这里有一篇关于迁移的详细文章:https://medium.com/@nivekz/migrate-from-co-to-async-functions-4635d32d12bf

    【讨论】:

      猜你喜欢
      • 2019-05-31
      • 2021-06-05
      • 2020-10-04
      • 2018-02-13
      • 2017-08-27
      • 2021-07-04
      • 2019-06-16
      • 2018-03-05
      • 2013-08-19
      相关资源
      最近更新 更多