8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

8
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?