2016-09-19 4 views
0

私のデータベースのシードデータを作成しています。私は1件の入札ごとに40回のオークションを作成しようとしている1点でコミットされたジェネレータを含むPromiseの並列化

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

:シード機能は、共同ラップジェネレータ(https://www.npmjs.com/package/co)です。 今まで私は、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は、配列で歩留まりを使用する場合の並列実行をサポートします。

しかし、私は依然としてインボイスを作成し、次にイールドを使用してインボイスを作成する必要があります。

プロミスと内部のラップされたジェネレータ関数で上記をラップしようとしましたが、実行を終了しません。

どうすればこの問題を解決できますか?ここ

は、内側の発電機との私の試みである(より多くのパッケージを使用せずに可能な場合):

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

約束ちょうどその部分を省略し、co()はすでに約束を返します。本当に救助する!内側の発電機であなたの試みを見せてください。また、 'create'は何を返しますか?すでに約束を使っていますか? – Bergi

+0

@Bergi 'create'はPromiseを返します。私は内側のジェネレータを追加しました。 – Hedge

答えて

1

new Promiseを呼び出す必要はありません(とあなたが呼び出すことはありませんので、それは動作しませんresolvereject )。

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); 
+0

これは素晴らしいです。私は前に自分のコードで 'resolve()'を持っていましたが、Promiseを明示的に追加することなく、それはさらに優れています。 – Hedge

+0

はい、それを不必要に導入しても、[反パターン](http://stackoverflow.com/q/23803743/1048572)です - あなたは 'try {...} catch(e){reject {e}}'ジェネレータでもエラーを伝播させる – Bergi

関連する問題