Promiseで非同期処理を書くとき、new Promise
で Promise
オブジェクトを生成する方法と、Promise.resolve
で Promise
オブジェクトを生成する方法があります。例えば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は非常に便利ですが、それぞれの違いに留意して記述する必要があります。