[解決済み] 解決に着手しないまま(ES6)プロミスを作成する
2023-04-04 19:39:04
質問
ES6プロミスを使用して、それを解決するためのロジックを定義せずにプロミスを作成するにはどうすればよいですか?以下は基本的な例です(一部TypeScript)。
var promises = {};
function waitFor(key: string): Promise<any> {
if (key in promises) {
return promises[key];
}
var promise = new Promise(resolve => {
// But I don't want to try resolving anything here :(
});
promises[key] = promise;
return promise;
}
function resolveWith(key: string, value: any): void {
promises[key].resolve(value); // Not valid :(
}
これは他のプロミスライブラリでも簡単にできます。例えばJQueryの。
var deferreds = {};
function waitFor(key: string): Promise<any> {
if (key in promises) {
return deferreds[key].promise();
}
var def = $.Deferred();
deferreds[key] = def;
return def.promise();
}
function resolveWith(key: string, value: any): void {
deferreds[key].resolve(value);
}
これを実現する唯一の方法は、resolve関数をプロミスのエグゼキュータ内のどこかに格納することですが、これは面倒なように思えますし、この関数が正確にいつ実行されるのかが定義されていません。
ありがとうございます。
どのように解決するのですか?
いい質問ですね。
このユースケースをサポートするために、プロミスコンストラクタに渡されるリゾルバは意図的に同期的に実行されます。
var deferreds = [];
var p = new Promise(function(resolve, reject){
deferreds.push({resolve: resolve, reject: reject});
});
そして、後のある時点で
deferreds[0].resolve("Hello"); // resolve the promise with "Hello"
promiseコンストラクタが与えられているのは、そのためです。
- 一般的に(常にではありませんが)解決ロジックは作成に束縛されます。
- プロミスコンストラクタはthrow safeであり、例外を拒否に変換します。
時には合わないこともあり、そのためにリゾルバは同期的に実行されます。 このトピックに関する関連記事を以下に示します。 .
関連
-
[解決済み] JavaScriptで複数行の文字列を作成する
-
[解決済み] ページを再読み込みせずにURLを変更するにはどうすればよいですか?
-
[解決済み] jQueryを使用しない$(document).ready相当
-
[解決済み] 新しい配列を作成せずに、既存のJavaScript配列を別の配列で拡張する方法
-
[解決済み] 明示的なプロミス構築のアンチパターンとそれを回避する方法とは?
-
[解決済み] JavascriptのPromiseを関数スコープ外で解決する
-
[解決済み】Node.jsのrequireとES6のimport/exportを使い分ける。
-
[解決済み] .then()チェーンで以前のプロミス結果にアクセスするにはどうすればよいですか?
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] moment.jsでミュータビリティを回避するには?
最新
-
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 ES6 promise for loop [重複]について
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] ECMAScriptとは?
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] javascriptでオプションのパラメータを扱う