首頁 >web前端 >js教程 >Promise.all 如何改善並發非同步操作處理並避免未處理的拒絕?

Promise.all 如何改善並發非同步操作處理並避免未處理的拒絕?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-23 17:03:32727瀏覽

How Can Promise.all Improve Concurrent Async Operation Handling and Avoid Unhandled Rejections?

等待並發非同步操作

使用Promise.all 並行執行

要同時觸發多個非同步操作,請避免使用取得Promise 的模式然後依次等待他們。相反,利用 Promise.all 函數:

const [value1, value2] = await Promise.all([getValue1Async(), getValue2Async()]);

此方法同時啟動兩個非同步操作並在陣列中提供結果。

處理拒絕的 Promises

提供的解決方案並行運行這些操作,但先等待第一個操作完成,然後再等待第二個操作。雖然這允許並行執行,但它在處理被拒絕的 Promise 時引入了問題。

如果第一個 Promise 需要更長的時間才能完成,而第二個 Promise 失敗,Promise.all 將立即失敗,從而防止第一個 Promise 被拒絕。這可能會導致未處理的拒絕錯誤。

並行等待的語法

目前,沒有指定的並行等待語法,因此可以使用 Promise.all。關於await.all的討論已經出現,顯示未來增強的可能性。

方法比較

考慮以下範例,其中getValue1Async 需要500 毫秒才能解析,getValue2Async 需要100 毫秒才能拒絕:

順序執行:

async () => {
  try {
    const value1 = await getValue1Async();
    const value2 = await getValue2Async();
  } catch (e) {
    console.error(e);
  }
};

與Promise.all 並發執行:

async () => {
  try {
    const [value1, value2] = await Promise.all([getValue1Async(), getValue2Async()]);
  } catch (e) {
    console.timeEnd("Promise.all", e);
  }
};

輸出:

  • 順序:控制台輸出顯示在記錄順序之前有500 毫秒的延遲。
  • 併發:控制台輸出在 100 毫秒後顯示錯誤日誌。

結論:

使用 Promise.all 可以有效地實現非同步操作的並行執行和確保正確處理被拒絕的承諾。

以上是Promise.all 如何改善並發非同步操作處理並避免未處理的拒絕?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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