我刚刚痛苦地意识到生成器函数不能用于等待。只承诺或异步功能。
我的团队构建了一个完整的应用程序,所有模块都包含生成器函数,从主js文件中调用Co模块。
除了通过数百个生成器函数并将它们从function*(...){
更改为async function(...){
之外,还有什么方法可以使生成器与async / await一起使用?
没有任何意义,因为yield * / generators和async / await在处理流程方面非常相似,所以我想知道他们是如何错过等待支持生成器的。
答案 0 :(得分:5)
你必须完成你的代码库并进行更改,是的(当然你可以编写/使用一个可以为你做任何事情的工具)。
但是,如果您愿意,可以逐步执行此操作:function*
将async function
替换为yield
,await
每yield*
,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
个对等方,yield
和yield*
替换为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