从发生器迁移到asynchronous/等待

我刚刚来到痛苦的认识,发电机function不能用于等待。 只承诺或asynchronousfunction。

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

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

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

你必须通过你的代码库并改变它,是的(当然你可以写/使用一个工具来为你做所有事情)。

但是,如果你愿意,你可以逐步完成:通过async functionreplace一个function* ,通过await和每个yield* await co(…)所有的yield* await co(…) ,然后改变每个调用从前面的生成器函数co(…) …()

因为async函数和co库可以和平共存,所以不需要从一个移植到另一个。

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

 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); 

除了通过数百个生成器函数并将它们从函数*(…){改为asynchronous函数(…){,还有什么可以使生成器与asynchronous/等待一起工作呢?

考虑到应用程序只能与co一起使用发生器,可以自动更换发生器。 function**方法被replace为async对手, yieldyield*被replace为await

在这之前,应该做一些初步的重构。 只有承诺和发电机应该从这个屈服列表中使用。 并行执行(数组和对象)应该被replace为相应的Promise.all

 const results = yield [...]; 

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

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