Promise.all が未定義の配列を返し、途中で解決してしまうのはなぜですか?

Linda Hamilton
リリース: 2024-10-31 21:19:02
オリジナル
692 人が閲覧しました

Why is Promise.all Returning an Undefined Array and Resolving Prematurely?

Promise.all 未定義の配列を返し、途中で解決する

Promise.all は、Promise オブジェクトの配列を受け入れ、すべての配列を一度解決するように設計されています。配列内の Promise が解決されました。ただし、提供されたコードでは、Promise.all のマップに渡されたコールバック関数が Promise を返さないために問題が発生します。

addText 関数内:

<code class="javascript">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Missing `return` statement causes undefined values in the array
    models.queries
      .findById(query.queryId, {
        raw: true,
        attributes: [ "query" ]
      })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);

        // Return the updated query as a resolved Promise
        return Promise.resolve(query);
      }, function(error) {
        // Return the error as a rejected Promise
        return Promise.reject(error);
      });
  }));
};</code>
ログイン後にコピー

何が起こっているかを次に示します。 :

  1. マップ コールバックは Promise を返さないため、結果の配列には未定義の値が含まれます。
  2. Promise.all は、結果の未定義値の配列をすぐに解決します。
  3. その後、.then() コールバックは Promise の配列ではなく、未定義の値の配列を受け取ります。

この問題を修正し、コールバック内のすべての Promise が完了した後でのみ Promise.all が解決されるようにするには解決済みの場合、コールバックは明示的に Promises を返す必要があります:

<code class="javascript">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Added `return` statement to wrap the Promise in the callback
    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);
      });
  }));
};</code>
ログイン後にコピー

現在、マップ コールバックは Promises を返します。これは、Promise.all が適切に処理し、すべての Promise が解決された場合にのみ解決できます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!