从Generators迁移到Async / Await

时间:2017-01-10 22:06:25

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

我刚刚痛苦地意识到生成器函数不能用于等待。只承诺或异步功能。

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

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

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

3 个答案:

答案 0 :(得分:5)

你必须完成你的代码库并进行更改,是的(当然你可以编写/使用一个可以为你做任何事情的工具)。

但是,如果您愿意,可以逐步执行此操作:function*async function替换为yieldawaityield*await co(…) co(…) {1}},然后将对前一个生成器函数的每次调用从…()更改为House::with('resident')->where('postcode', 'GL141PQ')->get();

答案 1 :(得分:3)

没有冲动从一个迁移到另一个,因为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);
  

除了通过数百个生成器功能并改变它们   从函数*(...){到异步函数(...){,如何生成器   是否可以使用async / await?

考虑到应用程序仅在与co一起使用的情况下,可以自动替换它们。 function**方法替换为async个对等方,yieldyield*替换为await

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

const results = yield [...];

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

答案 2 :(得分:1)

如果某人需要有关从co迁移到异步功能的更多信息,请参阅以下有关迁移的详细文章:https://medium.com/@nivekz/migrate-from-co-to-async-functions-4635d32d12bf