【问题标题】:Parallelize execution of Promise containing co wrapped generator并行执行包含 co 包装的生成器的 Promise
【发布时间】:2016-09-19 11:09:24
【问题描述】:

我正在为我的数据库创建种子数据。种子函数是 co-wrapped generator (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
    [...]
  })
}

现在我想并行创建拍卖,但我不能让它工作。

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

【问题讨论】:

  • 承诺救援,确实!请向我们展示您对内部生成器的尝试。另外,create 返回什么,它是否已经使用了 Promise?
  • @Bergi create 返回一个承诺。我添加了内部生成器。

标签: javascript node.js co


【解决方案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;

如果您不想使用内部生成器,也可以使用简单的 Promise 进行链接:

let promises = [];
for (let i = 0; i <= 40; i++) {
  promises.push(
    auction.create({
      [...]
    }).then(auction =>
      bid.create({
        auction: auction.id
        [...]
      });
    )
  );
}
yield Promise.all(invoicePromises);

【讨论】:

  • 太棒了。我之前在我的代码中有一个resolve(),但没有明确添加一个 Promise 它会更好。
  • 是的,即使是 antipattern 也不必要地引入它 - 您还需要在生成器中使用 try{…}catch(e){reject(e)} 来传播错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多