JavaScript 中使用Promise.all()方法經(jīng)驗(yàn)技巧詳解
JavaScript 中的 Promises 是什么?
如果你偶然發(fā)現(xiàn)了這篇文章,你可能已經(jīng)對(duì) promises 很熟悉了。但對(duì)于那些新接觸 JavaScript 的人來說,我們來詳細(xì)解釋一下。
從本質(zhì)上講,Promise 對(duì)象表示異步操作的最終完成或失敗。有趣的是,當(dāng) promise 被創(chuàng)建時(shí),其值可能不會(huì)立即可用。
const promise = new Promise((resolve, reject) => {
// 一些異步操作
if (/* 操作成功 */) {
resolve(result);
} else {
reject(error);
}
});它們有3種狀態(tài):
- Pending(待定):這是初始狀態(tài),既沒有實(shí)現(xiàn)也沒有被拒絕。
- Fulfilled(已實(shí)現(xiàn)):當(dāng) promise 成功完成并產(chǎn)生值時(shí)的狀態(tài)。
- Rejected(已拒絕):當(dāng)發(fā)生錯(cuò)誤并且 promise 中的操作不成功時(shí)的狀態(tài)。
一旦 promise 被解決,你可以使用 .then() 來處理結(jié)果,使用 .catch() 來管理其執(zhí)行過程中出現(xiàn)的任何錯(cuò)誤。
promise
.then(result => {
console.log('成功:', result);
})
.catch(error => {
console.error('錯(cuò)誤:', error);
});理解 Promise.all()
當(dāng)同時(shí)處理多個(gè) promises 時(shí),你可以利用內(nèi)置的 Promise.all([]) 方法。此方法接受一個(gè) promises 數(shù)組并返回一個(gè)統(tǒng)一的 promise。關(guān)鍵是,只有當(dāng)所有輸入的 promises 都成功解決時(shí),這個(gè)組合的 promise 才會(huì)解決。如果其中一個(gè)失敗,整個(gè) promise 就會(huì)被拒絕。以下是一個(gè)例子:
const promise1 = fetch('https://api.example.com/data1');
const promise2 = fetch('https://api.example.com/data2');
const promise3 = fetch('https://api.example.com/data3');
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log('所有數(shù)據(jù)已獲?。?, values);
})
.catch(error => {
console.error('發(fā)生錯(cuò)誤:', error);
});這種方法通常用于多個(gè)相關(guān)異步任務(wù)且其工作相互依賴的情況,因此我們希望在繼續(xù)執(zhí)行代碼之前,所有異步任務(wù)都能成功。
揭示 Promise.allSettled()
使用 Promise.allSettled([]) 與 Promise.all([]) 類似,但不同之處在于它會(huì)等待所有輸入的 promises 完成或被拒絕,并返回描述每個(gè) promise 結(jié)果的對(duì)象數(shù)組。
const promise1 = Promise.resolve('成功 1');
const promise2 = Promise.reject('錯(cuò)誤 2');
const promise3 = Promise.resolve('成功 3');
Promise.allSettled([promise1, promise2, promise3])
.then(results => {
results.forEach(result => {
if(result.status === 'fulfilled') {
console.log('成功取得值:', result.value);
} else {
console.error('因?yàn)樵虮痪芙^:', result.reason);
}
});
});
//輸出
// 成功取得值:成功 1
// 因?yàn)樵虮痪芙^:錯(cuò)誤 2
// 成功取得值:成功 3它通常用于處理不互相依賴的異步操作,你想知道每一個(gè)的結(jié)果。
為什么 Promise.allSettled() 更出色
總的來說,使用 Promise.allSettled() 而不是 Promise.all() 在大多數(shù)常見情況下都有其優(yōu)勢(shì):
全面的結(jié)果信息
如果 promises 中的任何一個(gè)被拒絕,Promise.all() 的立即拒絕可能會(huì)使得確定其他 promises 的狀態(tài)變得困難,尤其是當(dāng)其他 promises 成功解決時(shí)。
使用 Promise.allSettled([]) 可以為你提供結(jié)果的完整畫面。
優(yōu)雅的錯(cuò)誤處理
Promise.all() 的“快速失敗”方法在你想繼續(xù)進(jìn)行,而其中一個(gè)失敗時(shí)可能會(huì)受到限制,而 Promise.allSettled() 允許你單獨(dú)處理每個(gè) promise 的結(jié)果。
批量操作
當(dāng)處理批量操作時(shí),其中的單個(gè)操作是獨(dú)立的,你可能不希望整個(gè)批次因操作失敗而失敗。
明智的決策
使用 Promise.allSettled() 后,你可以在獲得所有 promises 的結(jié)果后做出更明智的決策。
例如,當(dāng)你從不同的 API 獲取數(shù)據(jù),其中一個(gè)失敗時(shí),你可以決定是否繼續(xù)處理數(shù)據(jù)或提供帶有錯(cuò)誤消息的通知。
增強(qiáng)的用戶體驗(yàn)
通常,為用戶提供必要的部分結(jié)果和錯(cuò)誤通知要比使用某些通用消息使整個(gè)操作失敗更好。
Promise.allSettled() 使這種方法易于實(shí)施。
總結(jié)
總之,Promise.all() 在某些情況下可能很有價(jià)值,但 Promise.allSettled() 為大多數(shù)場(chǎng)景提供了更靈活和更有韌性的方法,更多關(guān)于JavaScript Promise.all的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 微信小程序 es6-promise.js封裝請(qǐng)求與處理異步進(jìn)程
- 基于promise.js實(shí)現(xiàn)nodejs的promises庫
- Javascript?promise.all的用法介紹(簡(jiǎn)潔易懂)
- 在JavaScript中使用Promise.allSettled()的方法
- 深入理解JS中的Promise.race控制并發(fā)量
- JavaScript中promise.all和promise.race的區(qū)別詳解
- 深入理解JS中?Promise.all?和?Promise.allSettled?特性和區(qū)別應(yīng)用場(chǎng)景分析
- JavaScript Promise.all 靜態(tài)方法常見問題記錄
- JS中Promise.all 與 Promise.race的區(qū)別小結(jié)
- JavaScript中Promise.try() 的用法小結(jié)
相關(guān)文章
初學(xué)js插入節(jié)點(diǎn)appendChild insertBefore使用方法
由于可見insertBefore()方法的特性是在已有的子節(jié)點(diǎn)前面插入新的節(jié)點(diǎn)但是兩種情況結(jié)合起來發(fā)現(xiàn)insertBefore()方法插入節(jié)點(diǎn),是可以在子節(jié)點(diǎn)列表的任意位置。2011-07-07
解決npm安裝Electron緩慢網(wǎng)絡(luò)超時(shí)導(dǎo)致失敗的問題
下面小編就為大家分享一篇解決npm安裝Electron緩慢網(wǎng)絡(luò)超時(shí)導(dǎo)致失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
微信小程序?qū)崿F(xiàn)根據(jù)字母選擇城市功能
這篇文章主要為大家詳細(xì)介紹了微信小程序中根據(jù)字母選擇城市的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Javascript實(shí)現(xiàn)的簡(jiǎn)單右鍵菜單類
這篇文章主要介紹了Javascript實(shí)現(xiàn)的簡(jiǎn)單右鍵菜單類,通過JavaScript自定義類實(shí)現(xiàn)右鍵菜單功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
微信小程序?qū)崿F(xiàn)頁面導(dǎo)航與傳參功能詳解
這篇文章主要為大家詳細(xì)介紹一下微信小程序?qū)崿F(xiàn)頁面導(dǎo)航的幾種方法以及幫助大家掌握微信小程序如何進(jìn)行傳遞參數(shù),感興趣的朋友可以了解一下2022-08-08
如何使用wheelnav.js構(gòu)建酷炫的動(dòng)態(tài)導(dǎo)航菜單
本文主要介紹一種基于SVG的web動(dòng)態(tài)導(dǎo)航組件,通過這個(gè)組件可以實(shí)現(xiàn)很多豐富酷炫的效果,首先介紹這款wheelnav.js的相關(guān)知識(shí),然后結(jié)合代碼講解如何在html頁面中創(chuàng)建其對(duì)象,接著講解wheelnav的一些屬性和方法,最后給出基于wheelnav的實(shí)際成果,喜歡的朋友一起學(xué)習(xí)吧2024-06-06
ES6新特性三: Generator(生成器)函數(shù)詳解
這篇文章主要介紹了ES6新特性之Generator(生成器)函數(shù),簡(jiǎn)單分析了Generator(生成器)函數(shù)的功能、定義、調(diào)用方法并結(jié)合實(shí)例形式給出了相關(guān)使用技巧,需要的朋友可以參考下2017-04-04

