1. ホーム
  2. javascript

[解決済み] 解決に着手しないまま(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であり、例外を拒否に変換します。

時には合わないこともあり、そのためにリゾルバは同期的に実行されます。 このトピックに関する関連記事を以下に示します。 .