0

データベースのシード データを作成しています。シード関数は共同ラップされたジェネレーターです ( https://www.npmjs.com/package/co ):

createSeedData () {
  co(function * () {
     [...]
  }
}

ある時点で、それぞれ 1 つの入札で 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
4

1 に答える 1

1

呼び出す必要はありません (また、またはnew Promiseを呼び出すことがないため、機能しません)。その部分を省略するだけで、既に promise が返されます。resolverejectco()

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);
于 2016-09-19T16:04:46.203 に答える