8

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

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

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

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

4

3 回答 3

6

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

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

于 2017-01-10T22:22:24.910 回答
4

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

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**方法被替换为async对应项,yield并被yield*替换为await.

在此之前,应该进行一些初步的重构。从这个 yieldables 列表中只能使用 promises 和 generators 。并行执行(数组和对象)应分别替换为Promise.all

const results = yield [...];

const results = yield Promise.all([...]);
于 2017-01-10T23:53:46.887 回答
1

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

于 2017-07-30T07:13:35.933 回答