6) Static Method
ここまでの例ではPromiseオブジェクトを作成する時に、コンストラクタ関数を使用していました。
var promise = new Promise(function(resolve,reject){
resolve(1);
});
ES6 Promise には補助的な動作をするStatic Methodが存在します。
// fulfilledな状態のPromiseオブジェクトを生成
Promise.resolve(1);
// rejectedな状態のPromiseオブジェクトを生成
Promise.reject(new Error('abort'));
これらのStatic Methodはコンストラクタ関数のシンタックスシュガーで、より簡単に fulfilled および rejected なPromiseオブジェクトを生成することができます。
Static Methodの便利な使い方
Static Methodを利用すると、関数や値(同期処理)をPromiseオブジェクト(Thenableな非同期処理)に変換する事ができます。
// Promiseオブジェクトを返す
function task(){
return new Promise(function(resolve,reject){
return resolve(1);
});
}
// 値を返す
function func(){
return 2;
}
// Promiseオブジェクトとそうでないものを混在させてメソッドチェインを行う
Promise.resolve(func())
.then(task)
;
Static Methodの中でエラーが発生した場合
Static Methodに渡した関数の中でエラーが発生した場合はどうなるのでしょうか。
function func(){
throw new Error('unexpected');
return 1;
}
Promise.resolve(func())
.then(function(){
console.info('fulfilled');
})
.catch(function(){
console.log('rejected');
})
;
// ブラウザのエラー
// Uncaught Error: unexpected
func()
の返却した値をPromiseオブジェクトに変換するため、返却する前に発生したエラーは通常通りブラウザが拾います。
resolveに渡された値がエラーの場合
ではエラーをPromise.resolve()
するとどうなるのでしょうか?
rejected として扱われるのでしょうか?
function func(){
return new Error('unexpected');
}
Promise.resolve(func())
.then(function(value){
console.info(value); // Error: unexpected(...)
})
.catch(function(){
console.log('rejected');
})
;
resolve()
は常に fulfilled なPromiseオブジェクトを返すため「エラーを値として持った fulfilled 」として扱われます。