首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含协包生成器的承诺的并行执行

包含协包生成器的承诺的并行执行
EN

Stack Overflow用户
提问于 2016-09-19 11:09:24
回答 1查看 59关注 0票数 0

我正在为我的数据库创建种子数据。种子函数是共包装生成器(https://www.npmjs.com/package/co):

代码语言:javascript
复制
createSeedData () {
  co(function * () {
     [...]
  }
}

有一次,我试图创建40个拍卖,每一个出价。直到现在我才有了这样的循环:

代码语言:javascript
复制
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支持与数组一起使用产量时的并行执行。

然而,我仍然需要首先创建一个发票,然后一个出价它使用收益率。

我试着将上面的内容封装在一个承诺和一个内部协同包装的生成器函数中,但它始终没有完成执行。

如何解决这个问题?(如果可能的话,不使用更多的包)

下面是我对内部生成器的尝试:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-19 16:04:46

没有必要调用new Promise (而且它不起作用,因为您从不调用resolvereject)。只要省略这一部分,co()已经返回了一个承诺:

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
let promises = [];
for (let i = 0; i <= 40; i++) {
  promises.push(
    auction.create({
      [...]
    }).then(auction =>
      bid.create({
        auction: auction.id
        [...]
      });
    )
  );
}
yield Promise.all(invoicePromises);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39571749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档