从发生器迁移到asynchronous/等待
我刚刚来到痛苦的认识,发电机function不能用于等待。 只承诺或asynchronousfunction。
我的团队使用由发生器函数组成的所有模块构build了一个完整的应用程序,并从主js文件调用Co模块。
除了通过数百个生成器函数并将它们从function*(...){
改为async function(...){
,还有什么可以使生成器与asynchronous/等待一起工作呢?
没有任何意义,因为yield * / generator和async / await在处理stream程方面非常相似,所以我想知道他们是如何错过了等待支持生成器的。
你必须通过你的代码库并改变它,是的(当然你可以写/使用一个工具来为你做所有事情)。
但是,如果你愿意,你可以逐步完成:通过async function
replace一个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
对手, yield
和yield*
被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