Promise的幾個重要api

2022-09-10 16:30:33 字數 3946 閱讀 3024

//

1. 非promise物件,非thenable物件

promise.resolve(1).then(console.log) //1//

2. promise物件成功狀態

const p2 = new promise((resolve) => resolve(2))

promise.resolve(p2).then(console.log) //2

//3. promise物件失敗狀態

const p3 = new promise((_, reject) => reject('err3'))

promise.resolve(p3).

catch(console.error) //

err3

//4. thenable物件

const p4 =

}promise.resolve(p4).then(console.log) //4

//5. 啥都沒傳

promise.resolve().then(console.log) //

undefined

promise.reject()方法返回乙個帶有拒絕原因的promise物件。

promise.reject(new error('fail'))

.then(() => console.log('resolved'),

(err) => console.log('rejected', err))

//輸出以下內容

//rejected error: fail

//at :2:16

promise.all()方法用於將多個 promise 例項,包裝成乙個新的 promise 例項。這個靜態方法應該是面試中最常見的啦

const p = promise.all([p1, p2, p3])

最終p的狀態由p1p2p3決定,分成兩種情況。

(1)只有p1p2p3的狀態都變成fulfilledp的狀態才會變成fulfilled,此時p1p2p3的返回值組成乙個陣列,傳遞給p的**函式。

(2)只要p1p2p3之中有乙個被rejectedp的狀態就變成rejected,此時第乙個被reject的例項的返回值,會傳遞給p的**函式。

const p1 = promise.resolve(1)

const p2 = new promise((resolve) =>)

const p3 = new promise((resolve) =>)

const p4 = promise.reject('err4')

const p5 = promise.reject('err5')

//1. 所有的promise都成功了

const p11 =promise.all([ p1, p2, p3 ])

.then(console.log)

//[ 1, 2, 3 ]

.catch

(console.log)

//2. 有乙個promise失敗了

const p12 =promise.all([ p1, p2, p4 ])

.then(console.log)

.catch(console.log) //

err4

//3. 有兩個promise失敗了,可以看到最終輸出的是err4,第乙個失敗的返回值

const p13 =promise.all([ p1, p4, p5 ])

.then(console.log)

.catch(console.log) //

err4

有時候,我們希望等到一組非同步操作都結束了,不管每乙個操作是成功還是失敗,再進行下一步操作。顯然promise.all(其只要是乙個失敗了,結果即進入失敗狀態)不太適合,所以有了promise.allsettled

promise.allsettled()方法接受乙個陣列作為引數,陣列的每個成員都是乙個 promise 物件,並返回乙個新的 promise 物件。只有等到引數陣列的所有 promise 物件都發生狀態變更(不管是fulfilled還是rejected),返回的 promise 物件才會發生狀態變更,一旦發生狀態變更,狀態總是fulfilled,不會變成rejected

還是以上面的例子為例, 我們看看與promise.all有什麼不同

const p1 = promise.resolve(1)

const p2 = new promise((resolve) =>)

const p3 = new promise((resolve) =>)

const p4 = promise.reject('err4')

const p5 = promise.reject('err5')

//1. 所有的promise都成功了

const p11 =promise.allsettled([ p1, p2, p3 ])

.then((res) => console.log(json.stringify(res, null, 2)))

//輸出 /*[

, , ]

*///

2. 有乙個promise失敗了

const p12 =promise.allsettled([ p1, p2, p4 ])

.then((res) => console.log(json.stringify(res, null, 2)))

//輸出 /*[

, , ]

*///

3. 有兩個promise失敗了

const p13 =promise.allsettled([ p1, p4, p5 ])

.then((res) => console.log(json.stringify(res, null, 2)))

//輸出 /*[

, , ]

*/

promise.race()方法同樣是將多個 promise 例項,包裝成乙個新的 promise 例項。

const p = promise.race([p1, p2, p3])

只要p1p2p3之中有乙個例項率先改變狀態,p的狀態就跟著改變。那個率先改變的 promise 例項的返回值,就傳遞給p的**函式。

const p1 = new promise((resolve, reject) =>)

const p2 = new promise((resolve, reject) =>)

promise.race([p1, p2]).then((value) =>)

promise.race([p1, p2, 3]).then((value) =>)

Promise的幾個擴充套件API總結

和 promise.all 相反,當所有的promise被拒絕之後,none方法執行完成的決議,如果存在乙個promise執行完成的決議,none方法則執行拒絕 promise.none function promises const promisesfornonetest1 promise.rej...

Promise的幾個擴充套件API總結

和 promise.all 相反,當所有的promise被拒絕之後,none方法執行完成的決議,如果存在乙個promise執行完成的決議,none方法則執行拒絕 promise.none function promises const promisesfornonetest1 promise.rej...

Promise 靜態api用法總結

promise 靜態方法 allsettled 返回結果是個物件陣列,物件陣列中值的順序和傳入promise時的順序一致。返回所有promise的執行結果,只能在then中獲取,不執行catch。每個物件包含 status promise狀態 value promise執行成功的結果 reason ...