はじめに
promise使用の処理を指定件数毎に実行する方法を記録しておきます
環境的にasync,awaitを使用した書き方はできないため、一昔前(?)の書き方になっています。
まだまだ分かっていないことも多いので、気になることがあれば教えてください。
1件ずつ実行
引数で渡された配列の件数分、1件ずつ処理する
sample
function execute(documentList) {
return new Promise(function (resolve, reject) {
// 最初はresolveを設定
var p = Promise.resolve();
// 処理したい件数分、p.then().p.then()…でつなげます
documentList.forEach(function () {
p = p.then(function () {
return slowProcess();
});
});
// 処理結果を判定する
p.then(function () {
// すべての処理が成功
return resolve();
}).catch(function (e) {
return reject(e);
});
});
}
execute(documentList);
一定数毎に実行
全部で100件行いたい処理を、10件ずつ処理する
sample
function execute() {
return new Promise(function (resolve, reject) {
// 処理開始のindex
var currentIndex = 0;
// 1回あたりの処理件数
var concurrency = 10;
// 処理済み件数
var processCount = 0;
// 処理する全件数
var countMax = 100;
dividePromise(currentIndex)
.then(function () {
// ・・・処理成功後にしたいこと記述
return resolve();
}).catch(function (e) {
return reject(e);
});
/**
* 指定した回数で分割実行
* @param {integer} cIndex 処理開始の件数
*/
function dividePromise(cIndex) {
return new Promise(function (resolve, reject) {
var chunks = [];
// 実行したい件数分、配列へ設定
for (var i = cIndex; i < cIndex + concurrency; i++) {
if (i >= countMax) { break; }
chunks.push(slowProcess());
}
// 設定した分をPromise.allですべて実行
Promise.all(chunks)
.then(function (results) {
// 処理済み件数を更新
processCount += results.length;
// 全件処理したため、終了
if (countMax === processCount) { return resolve(); }
cIndex += concurrency;
// 再呼び出し
return resolve(dividePromise(cIndex));
}).catch(function (e) {
return reject(e);
});
});
}
});
}
slowProcess
/**
* とっても重い処理
*/
function slowProcess() {
return new Promise(function (resolve) {
setTimeout(function () {
console.log('test');
return resolve();
}, 20000);
});
}