我正在为我的数据库创建种子数据。种子函数是共同包装的生成器(https://www.npmjs.com/package/co):
createSeedData () {
co(function * () {
[...]
}
}
有一次,我试图创建40个拍卖,每个拍卖一次。 到目前为止,我有一个像这样的for循环:
for (let i = 0; i <= 40; i++) {
let auction = yield auction.create({
[...]
}) // Async creation of model and persisting it in db
yield bid.create({
auction: auction.id
[...]
})
}
现在我想同时创建拍卖,但我无法让它发挥作用。
当yield与数组一起使用时, co
支持并行执行。
但是,我仍然需要首先创建一个发票,然后使用yield来竞标它。
我尝试将上面的内容包含在Promise和内部共同包装的生成器函数中,但它永远不会完成执行。
如何解决此问题? (如果可能,不使用更多软件包)
这是我对内部生成器的尝试:
let promises = []
for (let i = 0; i <= 40; i++) {
promises.push(new Promise(
co(function *(resolve, reject) {
let auction = yield auction.create({
[...]
}) // Async creation of model and persisting it in db
yield bid.create({
auction: auction.id
[...]
})
)
resolve()
))
}
yield invoicePromises
答案 0 :(得分:1)
无需致电new Promise
(由于您从未致电resolve
或reject
,因此无法正常工作)。只要省略该部分,co()
已经返回一个承诺:
let promises = [];
for (let i = 0; i <= 40; i++) {
promises.push( co(function *() {
let auction = yield auction.create({
[...]
}); // Async creation of model and persisting it in db
yield bid.create({
auction: auction.id
[...]
});
));
}
yield invoicePromises;
如果你不想使用内部生成器,你也可以用简单的承诺进行链接:
let promises = [];
for (let i = 0; i <= 40; i++) {
promises.push(
auction.create({
[...]
}).then(auction =>
bid.create({
auction: auction.id
[...]
});
)
);
}
yield Promise.all(invoicePromises);