このタイプの問題にアプローチするには、いくつかの方法があります。まず、すべてのAPI呼び出しを同時に(すべて同時に実行中)実行でき、データベースにどのような順序で挿入されても問題がなければ、それを実行することでより速く結果を得ることができます(vsそれらを順番に直列化する)。
const rp = require('request-promise');
function apicall(urlApi){
return rp({url: urlApi, json: true}).then(function(obj){
return dbInsert(obj);
});
}
function dbInsert(obj) {
//insert into database
// return a promise that resolves when the database insertion is done
}
を使用して並列ES6標準でブルーバード約束ライブラリ
を使用してパラレル
let promises = [];
for (let i = 0; i <= data.length; i++) {
promises.push(apicall(data[i]));
}
Promise.all(promises).then(() => {
// all done here
}).catch(err => {
// error here
});
を約束:あなたはこのコードを使用することになり、以下のすべてのオプションで
、 Bluebird Promiseライブラリ、Promise.map()
を使用できます配列を反復するには、concurrency
オプションを渡して、同時に飛行している非同期呼び出しの数を制御します。これは、データベースまたはターゲットAPIホストの圧倒的な増加を防ぎ、最大メモリ使用量を制御するのに役立ちます。標準ES6を使用して
シリーズで Promise.map(data, apiCall, {concurrency: 10}).then(() => {
// all done here
}).catch(err => {
// error here
});
は、あなたがそのような順序でデータベースに挿入するなど、いくつかの理由のためにそれらをシリアル化する必要がある場合、あなたはこのようにそれを行うことができます
をお約束します。呼び出し、ブルーバードが
ブルーバードが直列に配列を繰り返し処理Promise.mapSeries()
を有する約束使用直列に
data.reduce(data, (p, item) => {
return p.then(() => {
return apicall(item);
});
}, Promise.resolve()).then(() => {
// all done here
}).catch(err => {
// error here
});
:以下に示す.reduce()
パターンは標準ES6を用いてアレイ上約束操作をシリアル化するための古典的な方法であります手作業よりも簡単な配列の各項目に約束を返す関数です。
Promise.mapSeries(data, apiCall).then(() => {
// all done here
}).catch(err => {
// error here
});
async/awaitを調べると、apicallがアクティブな間に一時停止することができます。 – theGleep
'i'インクリメントは、あなたのケースで問題を引き起こすべきではありません。あなたの問題はおそらく他のものです。 –