Explorando 承諾:.all 與 .allSettled / .race 與 .any
隨著 ECMAScript 6 (ES2015) JavaScript 規範的發布,2015 年出現了一些承諾,讓我們作為開發人員在處理非同步操作時的體驗變得更加簡單。
如果您學習或使用 JavaScript,您可能已經使用過 Promise.all() 或 Promise.race()。為了讓開發人員的生活更輕鬆,隨著最新版本 JavaScript 的發布,我們可以存取兩個新的 Promises 方法:Promise.allSettled() 和 Promise.any()(分別為 ES11 和 ES2021)。
但是它們之間有什麼區別以及我們什麼時候應該使用它們?
概括
Promise.all 與 Promise.allSettled:專注於結果
Promise.race 與 Promise.any:專注於速度
Promise.all 與 Promise.allSettled:專注於結果
想像一下,您正在開發一個應用程序,在某個時刻需要執行不同的 API 呼叫。如果這些調用彼此獨立,一個好的選擇是同時執行所有調用,除了使程式碼更加簡潔之外,還可以提高應用程式的效能。
Promise.all()
- 接收一個 Promise 陣列 作為參數;
- 同時(並行)執行操作;
- 當所有 Promise 成功解決時解決;
- 如果其中一個 Promise 失敗,則立即拒絕,並阻止後續 Promise 的執行。
async function buscarDadosParalelo() { const [usuarios, produtos] = await Promise.all([ fetch('/api/usuarios').then(resp => resp.json()), fetch('/api/produtos').then(resp => resp.json()), ]); return { usuarios, produtos }; }
Promise.all() 當您需要確保所有 Promise 都成功 並且函數在執行其他操作之前收到所需的所有結果時
非常有用。 >Promise.allSettled()
- 也接收一個 Promise 陣列 作為參數;
- 也同時(並行)執行操作;
- 當所有 Promise 完成執行時解析,無論成功或失敗,為每個 Promise 傳回一個包含其狀態(已完成或拒絕)的物件;
- 從不拒絕,因此也不會阻止 Promise 的執行。
async function buscarDadosParaleloComFalhas() { const resultados = await Promise.allSettled([ fetch('/api/usuarios').then(resp => resp.json()), fetch('/api/produtos').then(resp => resp.json()), ]); // Verificar cada resultado individualmente: const dados = resultados.map(resultado => { if (resultado.status === 'fulfilled') { return resultado.value; } else { console.error(resultado.reason); return null; } }); return dados; }
Promise.allSettled() 如果任何 Promise 以失敗結束,則不會阻止應用程序,此外允許單獨處理每個調用的成功或錯誤。它就像一個狀態報告,等待所有請求得到解決或拒絕,並允許使用者評估和處理每個案例。
回摘要
Promise.race 與 Promise.any:專注於速度
另一方面,當我們談論 Promise.race() 和 Promise.any() 時,我們討論的是處理一組非同步操作中的第一個回應的方法。
Promise.race()
- 贏得陣列腳本化的Promise;
- 同時(並行)執行操作;
- 傳回第一個已完成或被拒絕的 Promise。
async function buscarDadosParalelo() { const [usuarios, produtos] = await Promise.all([ fetch('/api/usuarios').then(resp => resp.json()), fetch('/api/produtos').then(resp => resp.json()), ]); return { usuarios, produtos }; }
Promise.race() 當我們需要快速回應時非常有用 - 第一個可用的返回,無論是成功還是錯誤。它也廣泛與超時一起使用,如上例,以確保我們在限定時間內有任何回應,並且可以防止緩慢的請求繼續消耗資源。
Promise.any()
- 您也可以取得一個腳本化 Promise 陣列;
- 同時(並行)執行操作;
- 返回第一個成功完成的Promise,忽略拒絕;
- 僅當所有 Promise 都被拒絕時才拒絕。
async function buscarDadosParaleloComFalhas() { const resultados = await Promise.allSettled([ fetch('/api/usuarios').then(resp => resp.json()), fetch('/api/produtos').then(resp => resp.json()), ]); // Verificar cada resultado individualmente: const dados = resultados.map(resultado => { if (resultado.status === 'fulfilled') { return resultado.value; } else { console.error(resultado.reason); return null; } }); return dados; }
Promise.any() 當您需要至少一個請求成功完成時很有用,非常適合後備和冗餘,如何從多個來源(CDN、本地等)載入資源或在失敗時連接到不同的伺服器。
回摘要
在日益非同步的數位世界中,了解如何在 JavaScript 中管理多個同時操作已成為開發人員的基本技能。在本文中,我們透過一些範例探討了一些重要的 Promise 方法,展示了它們各自的工作原理,更重要的是,您何時以及為何應該選擇其中一種。
下次再見(我保證我很快就會回來)!
以上是Explorando 承諾:.all 與 .allSettled / .race 與 .any的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。
