Promise
の then
で呼び出す際に引数が与えたいと思ったことがある。
引数付きPromiseチェイン
与えた引数のミリ秒数 だけ setTimeout
で resolve()
する Promise
のコードは下記
code.js
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(...)
の中で引数付きで呼び出せる。
code2.js
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