Promiseでwaterfall

async離れが完了したが、気づくとPromiseでasync-waterfall的なものを何度も書いていた。Promise.resolve()で始めたり、そうでなかったり。名前付き関数を受け取るだけのthen()を何度も書き、読みにくいなとなったり。

とりあえず、Array#reduce()を使って配列と初期変数を渡すと順に実行していくものを書いた。

// waterfall([funcA, funcB, funcC], foo)
//   .then((r) => {
//     console.log(r);
//   })
//   .catch((e) => {
//     console.error(e.stack);
//   });
"use strict";

module.exports = (tasks, initialValue) => {
  if (!initialValue) {
    initialValue = null;
  }

  return tasks.reduce((p, t) => {
    return p.then(t);
  }, Promise.resolve(initialValue));
};

多少読みやすくはなるが、then()を書かないで済むくらいしかメリットがない。途中で止められないな(常にthen()なので)とかも考えると普通に書いた方が良さそうだ。


同時実行数を制限した並行実行と、チェーンの途中で特定のエラーだったら最初からやり直す、というのをPromiseでスッと書けるようになりたい。ネストしてると気が変になってくる。