Posted at

Promise.then() で引数を与えたい

More than 1 year has passed since last update.

Promisethen で呼び出す際に引数が与えたいと思ったことがある。


引数付きPromiseチェイン

与えた引数のミリ秒数 だけ setTimeoutresolve() する 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