Promise の then で呼び出す際に引数が与えたいと思ったことがある。
引数付きPromiseチェイン
与えた引数のミリ秒数 だけ setTimeout で resolve() する Promise のコードは下記
var wait_msec = function (timeout) {
return function () { // *1
return new Promise((resolve) => { // *2
setTimeout(()=>{
resolve();
}, timeout);
});
};
};
ポイントは、 *1 と記述のある return function(){...} を先に記述し、 その中で *2 の記述のある return new Promise(...) を行う。
これにより、上記 wait_msec は下記のように Promise.then(...) の中で引数付きで呼び出せる。
var main = function(){
Promise.resolve()
.then( wait_msec(1000) ) // 1秒待つ
.then( ()=>{ console.log("1000 msec"); })
.then( wait_msec(2000) ) // 2秒待つ
.then( ()=>{ console.log("2000 msec"); })
;
}
ポイントとして、 Promise の一番最初は Promise.resolve() で開始することである。
代わりに wait_msec(1000)().then(...) ということもできるが可読性が落ちると思うのでお勧めしない。
十分な検証はとっていないので指摘歓迎です。
個人的な疑問
CodePenで下記のようなコードを書いている。引数を守る必要があるかと思い 42行目あたりのコメントアウトでクロージャー版を記述したが、クロージャーしなくても期待通りに動いている。クロージャーは不要なのだろうか。
CodePen - anon/pen/opaOyJ