web-dev-qa-db-ja.com

マップ機能にbluebird同時実行オプションを使用する方法

組み込みの同時実行制御でbluebirdのmap関数を使用しようとしています。

名前のリストを取得してから、名前ごとにPOSTリクエストをいくつか作成します。たとえば、曜日ごとに名前ごとにリクエストを作成したいのですが。目的のサーバーにはレート制限があるため、同時POSTリクエストの数を調整する必要があります。

function getNames() {
    //Open mongodb connection
    //Get collection and array of names
    //return array of names in a promise 
}

function createDatesArray() {
    //Create an array of rates
    //return array of dates in a promise
    //Ex. return Promise.resolve(datesArray);
}

getNames().map(function (name) {
    return createDatesArray().map(function (date) {
        return requestData(date, name);
    }, {concurrency: 5});
}).then(function () {
//do something
});

これはbluebirdの同時実行を使用する正しい方法ですか?

ドキュメントのリンクはここにあります bluebirdドキュメント

14
aefhm

簡単な答え:yes、これによりリクエストの数が5に制限されます。

警告:HTTPクライアントや、使用している可能性のあるその他のプール、モジュール、サービスなど、さらに多くの制限が適用される可能性があることに注意してください。

また、Mongo接続は永続的な接続として使用することを目的としているため、毎回開いたり閉じたりするのではなく、おそらく1つだけ開いてから使用する必要があります。

createDatesArrayが非同期を実行しない場合は、Promise.resolveを実行する必要はありません。代わりに、mapの静的バリアントをPromise.map(datesArray, function(date){ ... })などとして使用できます。ネストではありません。 createDatesArrayが実際に非同期であると仮定します。

Promise.join(getNames(), createDatesArray(), function(names, dates){
    var tasks = [];
    names.forEach(function(name ){ // create Cartesian product of names * dates
        dates.forEach(function(date){
             tasks.Push(function(){ return requestData(name, date); });
        });
    });
    return Promise.map(tasks, function(job){ return job(); } , { concurrency: 5} );
}), then(function(results){
     // do whatever
});
15