//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
的狀態由p1
、p2
、p3
決定,分成兩種情況。
(1)只有p1
、p2
、p3
的狀態都變成fulfilled
,p
的狀態才會變成fulfilled
,此時p1
、p2
、p3
的返回值組成乙個陣列,傳遞給p
的**函式。
(2)只要p1
、p2
、p3
之中有乙個被rejected
,p
的狀態就變成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])
只要p1
、p2
、p3
之中有乙個例項率先改變狀態,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 ...