詳解JavaScript中Promise類的使用方法
這篇主要講一下Promise的類方法的基本使用,至于Promise的基本使用這里就不贅述了,之前也有手寫過Promise、實(shí)現(xiàn)了Promise的核心邏輯。其實(shí)我們平時用Promise也挺多的,不過又出現(xiàn)了兩個新的語法(ES11,ES12新增了兩個),所以這篇就簡單說一下,也挺簡單
1. all
Promise.all方法我們可以傳入一個數(shù)組參數(shù),數(shù)組中可以放多個Promise,它會等所有的Promise的狀態(tài)都為fulfilled時,來獲取最終的結(jié)果,它會把所有每個Promise resolve的結(jié)果,放在一個數(shù)組中,且結(jié)果的順序和我們傳入的數(shù)組參數(shù)中的Promise保持一直(跟時間無關(guān))
const p1 = new Promise((resolve, reject) => { const obj = { data: '11111' } setTimeout(() => { resolve(obj) }, 3000) }) const p2 = new Promise((resolve, reject) => { const obj = { data: '22222' } setTimeout(() => { resolve(obj) }, 2000) }) const p3 = new Promise((resolve, reject) => { const obj = { data: '33333' } setTimeout(() => { resolve(obj) }, 1000) }) Promise.all([p1, p2, p3]).then(result => { console.log(result) }).catch(err => { console.log('err:', err) })
上面代碼會在3s后在then方法中拿到最終的結(jié)果如下:
但是all方法是有個缺陷的,當(dāng)有其中一個Promise變成rejected狀態(tài)時,新Promise就會立即變成對應(yīng)的reject狀態(tài),也就是只能在catch中捕獲到錯誤,其他fulfilled狀態(tài)的值我們是拿不到的。因此有了allSettled方法
2. allSettled
allSettled是在ES11(2020)中添加的新的API,Promise.allSettled
該方法會在所有的Promise都有結(jié)果時(無論是fulfilled,還是rejected)都會在then方法中拿到我們的最終的結(jié)果:
const p1 = new Promise((resolve, reject) => { const obj = { data: '11111' } setTimeout(() => { resolve(obj) }, 3000) }) const p2 = new Promise((resolve, reject) => { const obj = { data: '22222' } setTimeout(() => { reject(obj) }, 2000) }) const p3 = new Promise((resolve, reject) => { const obj = { data: '33333' } setTimeout(() => { resolve(obj) }, 1000) }) Promise.allSettled([p1, p2, p3]).then(result => { console.log(result) }).catch(err => { console.log('err:', err) })
我們傳入了三個Promise,在2s的時候我們的p2就reject拒絕了,但是我們同樣可以拿到結(jié)果,但是這個result結(jié)果數(shù)組結(jié)構(gòu)有點(diǎn)兒變化,我們看下打印結(jié)果:
我們可以看到allSettled的結(jié)果是一個數(shù)組,數(shù)組中存放著每一個Promise的結(jié)果,并且是對應(yīng)一個對象的;這個對象中包含status狀態(tài),以及對應(yīng)的value值
3. race
race是競技、賽跑的意思,也就是誰先有結(jié)果我就要誰,這個result拿到的結(jié)果就不是一個數(shù)組了,而是最快的一個Promise resolve出來的結(jié)果
const p1 = new Promise((resolve, reject) => { const obj = { data: '11111' } setTimeout(() => { resolve(obj) }, 3000) }) const p2 = new Promise((resolve, reject) => { const obj = { data: '22222' } setTimeout(() => { resolve(obj) }, 2000) }) const p3 = new Promise((resolve, reject) => { const obj = { data: '33333' } setTimeout(() => { resolve(obj) }, 1000) }) Promise.race([p1, p2, p3]).then(result => { console.log(result) }).catch(err => { console.log('err:', err) })
看下控制臺的打?。?nbsp;
因?yàn)閜3用時最短,最快,所以result拿到的就是p3resolve出的結(jié)果值,但是如果最快的那個reject了呢我們看一下:
const p1 = new Promise((resolve, reject) => { const obj = { data: '11111' } setTimeout(() => { resolve(obj) }, 3000) }) const p2 = new Promise((resolve, reject) => { const obj = { data: '22222' } setTimeout(() => { reject('出錯了~~~') }, 500) }) const p3 = new Promise((resolve, reject) => { const obj = { data: '33333' } setTimeout(() => { resolve(obj) }, 1000) }) Promise.race([p1, p2, p3]).then(result => { console.log(result) }).catch(err => { console.log('err:', err) })
我們修改一下代碼,將p2時間設(shè)置為0.5s,且是rejected的狀態(tài),我們再看下打印結(jié)果:
直接就會被catch捕獲了,這樣看來,如果最快的那個狀態(tài)為rejected狀態(tài)的話,那我們后面的resolve的狀態(tài)也拿不到值了。如果我們想拿到最快的fulfilled狀態(tài)的值,也就是如果前面有reject的,我們就忽略掉,接著等待下一個resolve的,怎么做呢,這就有了any方法
4. any
const p1 = new Promise((resolve, reject) => { const obj = { data: '11111' } setTimeout(() => { resolve(obj) }, 3000) }) const p2 = new Promise((resolve, reject) => { const obj = { data: '22222' } setTimeout(() => { reject('出錯了~~~') }, 500) }) const p3 = new Promise((resolve, reject) => { const obj = { data: '33333' } setTimeout(() => { resolve(obj) }, 1000) }) Promise.any([p1, p2, p3]).then(result => { console.log(result) }).catch(err => { console.log('err:', err) })
還是上一次的代碼,我們把方法改為any,再看一下打印結(jié)果:
我們在1s后就會拿到p3 resolve的結(jié)果, 那個p2 reject的就忽略掉了,那如果我們所有的Promise都是rejected狀態(tài)時它會怎么做呢?我們看一下:
const p1 = new Promise((resolve, reject) => { setTimeout(() => { reject('出錯了111~~~') }, 3000) }) const p2 = new Promise((resolve, reject) => { setTimeout(() => { reject('出錯了222~~~') }, 500) }) const p3 = new Promise((resolve, reject) => { setTimeout(() => { reject('出錯了333~~~') }, 1000) }) Promise.any([p1, p2, p3]).then(result => { console.log(result) }).catch(err => { console.log('err:', err, err.errors) })
我們看下打印結(jié)果:
它就會走catch了,并且打印出了錯誤信息,其中的 err.errors中會有我們reject傳遞的錯誤信息,err是它內(nèi)部封裝的錯誤提示
到此這篇關(guān)于詳解JavaScript中Promise類的使用方法的文章就介紹到這了,更多相關(guān)JavaScript Promise類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node.js 一個簡單的頁面輸出實(shí)現(xiàn)代碼
最近決定重拾node.js,用它來做一個合并JS文件的東西。由于忘得差不多了,先看能不能輸出一個頁面來再說。以下是我的一些筆記,省得以后又忘凈光2012-03-03javascript面向?qū)ο笾L問對象屬性的兩種方式分析
這篇文章主要介紹了javascript面向?qū)ο笾L問對象屬性的兩種方式分析,實(shí)例分析了直接訪問對象屬性的方式與數(shù)組訪問方式,需要的朋友可以參考下2015-01-01layer關(guān)閉彈出窗口觸發(fā)表單提交問題的處理方法
今天小編就為大家分享一篇layer關(guān)閉彈出窗口觸發(fā)表單提交問題的處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09微信小程序開發(fā)之實(shí)現(xiàn)食堂點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何通過微信小程序開發(fā)一個簡單的食堂點(diǎn)餐系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以和小編一起學(xué)習(xí)一下2023-01-01js中substring和substr兩者區(qū)別和使用方法
這篇文章主要介紹了js中substring和substr兩者區(qū)別和使用方法,每一個步驟都有相應(yīng)的文字介紹,感興趣的小伙伴們可以參考一下2015-11-11詳解JavaScript中的類型判斷與類型轉(zhuǎn)換
這篇文章主要給大家講解一下JavaScript中的類型判斷與類型轉(zhuǎn)換的基本概念和使用方法,對我們的學(xué)習(xí)JavaScript的類型判斷與轉(zhuǎn)換有一定的幫助,需要的朋友可以參考下2023-07-07