Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
59
Help us understand the problem. What is going on with this article?
@ueokande

new PromiseとPromise.resolveの違い

More than 5 years have passed since last update.

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は非常に便利ですが、それぞれの違いに留意して記述する必要があります。

59
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ueokande
Qiitaやめました

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
59
Help us understand the problem. What is going on with this article?