1. ホーム
  2. javascript

[解決済み] Promise.resolve vs new Promise(resolve)

2022-08-28 20:59:40

質問

bluebirdを使っていて、同期関数をPromiseに解決する方法が2つあるようですが、どちらの方法も違いがよくわかりません。スタックトレースが少し違うようなので、それらは単なる alias になっていますよね?

では、どのような方法が望ましいのでしょうか?

方法A

function someFunction(someObject) {
  return new Promise(function(resolve) {
    someObject.resolved = true;
    resolve(someObject);
  });
}

方法B

function someFunction(someObject) {
  someObject.resolved = true;
  return Promise.resolve(someObject);
}

どのように解決するのですか?

コメントの両方の答えに反して - 違いがあります。

一方

Promise.resolve(x);

とは基本的に同じです。

new Promise(function(r){ r(x); });

は微妙なところです。

Promiseを返す関数は、非同期にthrowする可能性があるため、一般に同期的にthrowしないように保証する必要があります。予期せぬ結果やレースコンディションを防ぐために、 - throwは通常、返された拒否に変換されます。

このことを念頭に置いて - 仕様が作成されたとき、プロミスコンストラクタはthrow safeです。

もし someObjectundefined ?

  • 方法Aは拒否されたプロミスを返します。
  • 方法Bは同期的に投げる。

これを見たブルーバードは、ペトカに Promise.method を追加してこの問題に対処し、戻り値を使い続けることができるようにしました。つまり、Bluebirdでこれを書くための正しくて最も簡単な方法は、実はどちらでもないんですねー。

var someFunction = Promise.method(function someFunction(someObject){
    someObject.resolved = true;
    return someObject;
});

Promise.methodはあなたのためにthrowをrejectsに、returnをresolveに変換してくれます。これは最も安全に投げられる方法であり、また then と同化します。 someObject が実際にはプロミスそのものであっても動作します。

一般的には Promise.resolve はオブジェクトや外部プロミス(Thenable)をプロミスにキャストするために使われます。それがその使用例です。