首頁 > web前端 > js教程 > 在映射中使用非同步函數時,為什麼 Promise.all 會解析為未定義值的陣列?

在映射中使用非同步函數時,為什麼 Promise.all 會解析為未定義值的陣列?

DDD
發布: 2024-11-02 09:27:02
原創
697 人瀏覽過

Why is Promise.all resolving with an array of undefined values when using async functions within a map?

Promise.all 解析未定義數組:揭開謎底

Promise 提供了非同步程式設計模型,從而提高了程式碼可讀性和流程控制。然而,有時會出現意想不到的問題。這個問題探討了為什麼 Promise.all 會傳回未定義的陣列並過早解析。

有問題的程式碼遵循典型的承諾鏈模式:

<code class="javascript">const getQueries = (models, dbId, dateStart, dateEnd) => {
  return new Promise((resolve, reject) => {
    // Fetch database and perform operations
    .then(extractQueries, reject)
      .then(sortQueries, reject)
      .then(onlyTen, reject)
      .then(addText, reject)
      .then((queries) => {
        console.log("getQueries finished", queries);
        resolve(queries);
      }, reject);
  });
};</code>
登入後複製

成功完成初始操作後操作中,問題出現在addText函數中:

<code class="javascript">const addText = (queries) => {
  return Promise.all(queries.map((query) => {
    // Oops! We're missing a `return` here!
    models.queries.findById(query.queryId, {
      raw: true,
      attributes: ["query"],
    })
      .then((queryFetched) => {
        query.text = queryFetched.query;
        console.log(query);

        return Promise.resolve(query);
      }, (error) => {
        return Promise.reject(error);
      });
  }));
};</code>
登入後複製

問題的根本原因在於map回呼函數中缺少return語句。 Promise.all 需要一個 Promise 物件數組,但如果沒有返回,回調會為查詢數組中的每個元素返回 undefined。

因此,Promise.all 立即解析為一個 undefined 數組,甚至在先前地圖內的實際承諾有機會解決。這種過早的解決方案會導致意外的行為和一組未定義的值。

要修正此問題,在addText 函數中的每個Promise 呼叫之前加入return 語句至關重要:

<code class="javascript">const addText = (queries) => {
  return Promise.all(queries.map((query) => {
    return models.queries.findById(query.queryId, {
      raw: true,
      attributes: ["query"],
    })
      .then((queryFetched) => {
        query.text = queryFetched.query;
        console.log(query);

        return Promise.resolve(query);
      }, (error) => {
        return Promise.reject(error);
      });
  }));
};</code>
登入後複製

現在,Promise.all 將正確等待數組中的所有Promise解析,從而產生包含查詢結果的預期輸出。

以上是在映射中使用非同步函數時,為什麼 Promise.all 會解析為未定義值的陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板