LoginSignup
82
65

More than 5 years have passed since last update.

new PromiseとPromise.resolveの違い

Posted at

Promiseで非同期処理を書くとき、new PromisePromise オブジェクトを生成する方法と、Promise.resolvePromise オブジェクトを生成する方法があります。例えばPromise.resolve(42); は下記のコードのシンタックスシュガーです(参考 : JavaScript Promiseの本)。

new Promise(function(resolve){
  resolve(42);
});

しかし例外時はその限りではないです。

次のコードは、2つの方法で Promise オブジェクトを生成します。どちらも 'Hello'resolveされた Promise オブジェクトが返って来ます。

function fn() {
  return 'Hello';
}

var ret1 = new Promise(function(resolve) {
  resolve(fn());
});
console.log(ret1);

var ret2 = Promise.resolve(fn());
console.log(ret2);
結果
Promise { 'Hello' }
Promise { 'Hello' }

一見するとこの2つのメソッドは等価に見えます。ではfn()の中で例外を投げてみるとどうでしょう。

function fn() {
  throw new Error('BAAD');
}

ret1 に関してはrejectされたPromiseオブジェクトが返ってきます。

結果
Promise { <rejected> [Error: BAAD] }

しかし ret2 に関しては、例外が発生してプログラムが停止しました。

new Promise では、コンストラクタ内で渡された関数を try{} で例外処理して呼び出し、例外発生時はrejectされた Promise オブジェクトを返します。しかし Promise.resolve を使うと、Promise.resolve 呼び出し前に例外がトップレベルで発生し、プログラムが終了します。

このように、2つのメソッドは異なる挙動をします。非同期処理にPromiseは非常に便利ですが、それぞれの違いに留意して記述する必要があります。

82
65
1

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
82
65