首頁 > web前端 > js教程 > 為什麼 Promise.all 會傳回未定義的陣列並過早解析?

為什麼 Promise.all 會傳回未定義的陣列並過早解析?

Linda Hamilton
發布: 2024-10-31 21:19:02
原創
746 人瀏覽過

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

Promise.all 傳回未定義的陣列並事先解析

Promise.all 旨在接受Promise 物件陣列並在所有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. map 回呼不會傳回Promise,因此結果陣列包含未定義的值。
  2. Promise.all 立即解析未定義值的結果陣列。
  3. 隨後, .then() 回呼會收到一組未定義的值,而不是一組 Promises。

要解決此問題並確保Promise.all 僅在回調中的所有Promise 後解析已解決,回調必須明確傳回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>
登入後複製

現在,map 回調返回Promises,只有在所有Promise 都已解決後,Promise.all 才能正確處理和解決。

以上是為什麼 Promise.all 會傳回未定義的陣列並過早解析?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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