[解決済み] 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です。
もし
someObject
は
undefined
?
- 方法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)をプロミスにキャストするために使われます。それがその使用例です。
関連
-
[解決済み] URLを新しいタブで開く(新しいウィンドウではない)
-
[解決済み] JavaScriptで配列の先頭に新しい配列要素を追加するにはどうすればよいですか?
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] 明示的なプロミス構築のアンチパターンとそれを回避する方法とは?
-
[解決済み] オブジェクトがPromiseであるかどうかを判断するにはどうすればよいですか?
-
[解決済み] JavascriptのPromiseを関数スコープ外で解決する
-
[解決済み] .then()チェーンで以前のプロミス結果にアクセスするにはどうすればよいですか?
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] BluebirdでNodeのchild_process.execとchild_process.execFile関数をプロミス化する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。