并行执行包含co包装生成器的Promise

时间:2016-09-19 11:09:24

标签: javascript node.js co

我正在为我的数据库创建种子数据。种子函数是共同包装的生成器(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

1 个答案:

答案 0 :(得分:1)

无需致电new Promise(由于您从未致电resolvereject,因此无法正常工作)。只要省略该部分,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);