ホームページ  >  記事  >  ウェブフロントエンド  >  Promise.all が未定義の値で解決されるのはなぜですか?

Promise.all が未定義の値で解決されるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 09:10:02343ブラウズ

Why Does Promise.all Resolve with Undefined Values?

Promise.all の早期解決: 未定義の配列の回避

概要

Promise.all は、複数の非同期操作を同時に実行し、それらの操作を集約するための強力なツールです。結果。ただし、正しく使用しないと、未定義の値の配列で解決されるなど、予期しない動作が発生する可能性があります。

問題

指定されたコードを考えてみましょう:

classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
  return new Promise(function(resolve, reject) {
    ...
    then(addText, reject)
      .then(function(queries) {
        console.log("getQueries finished", queries); // Array of 10× undefined!
        resolve(queries);
      }, reject);
  });
};

ここでは、addText 関数は、マップ コールバック内の個々の Promise が解決される前に、未定義の値の Promise.all を返します。これにより、getQueries は未定義の配列で解決されます。

解決策

すべての Promise が満たされた後に解決するには、各マップ コールバックから Promise を返します。

function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Return the promise to delay resolution until the operation succeeds/fails.
    return models.queries
      .findById(query.queryId, {
        raw: true,
        attributes: [ "query" ]
      })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        return Promise.resolve(query);
      }, function(error) {
        return Promise.reject(error);
      });
  }));
};

Avoiding Promise.all で未定義

Promise.all は Promise オブジェクトの配列を受け入れます。未定義の値はすぐに解決されるため、解決が早まる可能性があります。結果の配列が正しいことを保証するために、個々の操作から常に Promise を返します。

以上がPromise.all が未定義の値で解決されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。