首頁  >  文章  >  web前端  >  為什麼 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 解析為未定義的陣列。

解決方案

要在所有承諾完成後解析,請從每個映射回調返回承諾:

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);
      });
  }));
};

避免Promise.all 中未定義

請記住,Promise.all 接受Promise 物件的陣列。未定義的值將立即解析,可能導致過早解析。始終傳回每個單獨操作的承諾,以確保正確的結果陣列。

以上是為什麼 Promise.all 解析時會出現未定義的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn