LoginSignup
1
0

More than 3 years have passed since last update.

【備忘録】Promiseを一定数ごとに実行する

Last updated at Posted at 2021-02-26

はじめに

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);
  });
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0