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でスッと書けるようになりたい。ネストしてると気が変になってくる。