2017-03-13 5 views
1

私はこのようなエンドポイントと興亜のWebサーバーを持っていると仮定すると:すべてのアクションが明らかに実行された後Generator関数を並列で実行するには?

const perform = require(...); // some generator function 

exports.endpoint = function*() { 

    var results = yield getResults(); 

    // Respond the results 
    this.body = results; 
} 

exports.getResults = function*() { 

    var actions = [...]; 
    var results = []; 

    for (var action of actions) { 

     var result = yield perform(action); 

     results.push(results); 
    } 

    return results; 
} 

今すぐクライアントが応答を取得します。しかし、物事は、それぞれのアクションは、前の完了に依存しています。

これを並列実行する方法はありますか?

注:私は何とか結果を返して解決できない限り、それらを約束にすることは選択肢ではありません。

答えて

1

coは約束に発電機能をオン、およびそれらを非同期に実行します。 Promise.allが完了するのを待ちます。

exports.getResults = function*() { 

    var actions = [...]; 

    return yield Promise.all(actions.map(function(action) { 
     return co(function*() { 
      return yield perform(action); 
     } 
    })); 
} 
1

発生器はasync/awaitの流れをシミュレートすることで、コルーチンとして使用されている場合は、あなたが行うことができるはず。でも

var results = yield Promise.all(actions.map(action => perform(action))); 

か:

var results = yield Promise.all(actions.map(perform)); 

を私はわからないんだけどここでの正確な使用法については、coまたはBluebird.coroutineのジェネレータを使用すると、すでに約束をしているので、より明示的に使用することもできます。だから、

、代わりに:あなたが試すことができます

exports.getResults = function*() { 

    var actions = [...]; 
    var results = []; 

    for (var action of actions) { 

     var result = yield perform(action); 

     results.push(results); 
    } 

    return results; 
} 

exports.getResults = function*() { 

    var actions = [...]; 

    return yield Promise.all(actions.map(perform)); 
} 
+0

問題は 'perform(action)'は中断されたGeneratorを返し、実際の 'perform()'を実行しません。私が信じているKoa(またはBluebird.coroutine)が実際にこの関数を実行すると、 –

+0

実際にperform関数を実行するには 'co'libを使うことができますが、この解決法は意味がありますか? '戻り収率Promise.all(actions.map(機能(作用){ \t \t戻りCO(関数*(){ \t \t \tリターン収率(アクション)を行う。 \t \tを} \t}))。 ' –

+0

@ ShaiBen-Dorはい、それは理にかなっています、' co'はそのようなものには非常に適しています。また、Bluebirdの 'co'wrap'(' co'モジュールの一部)とコルーチンを使うこともできます。 http://bluebirdjs.com/docs/api/promise.coroutine.html – rsp

関連する問題