一削解、Promise基礎(chǔ)
1.為什么需要Promise?
js是一門單線程語言,所以早期我們在解決異步的場景時母蛛,通常使用回調(diào)函數(shù)來進行,但如果有多層異步函數(shù)嵌套的話(回調(diào)地獄)乳怎,將非常不利于后續(xù)的維護彩郊。
為了能使回調(diào)函數(shù)以更優(yōu)雅的方式進行調(diào)用,在ES6中產(chǎn)生了Promise的規(guī)范蚪缀,它讓異步操作變得近乎同步化秫逝。
2.Promise構(gòu)造函數(shù)
- 該構(gòu)造函數(shù)接受一個函數(shù),此函數(shù)接受兩個參數(shù)询枚,分別為resolve和reject违帆,代表我們需要改變當前實例的狀態(tài)到已完成或已拒絕。
3.Promise的狀態(tài)
Promise有三種狀態(tài):進行中/已完成/已拒絕
進行中的狀態(tài)可以更改為已完成或已拒絕金蜀,已經(jīng)更改過狀態(tài)后無法繼續(xù)更改刷后,如:不能將已完成狀態(tài)改為已拒絕狀態(tài)。
4.then方法
- 可在上一個promise達到已完成時渊抄,繼續(xù)執(zhí)行下一個函數(shù)或Promise尝胆,同時通過resolve或reject時傳入的參數(shù),給下一個函數(shù)或promise傳入初始值护桦。
5.捕獲拒絕狀態(tài)
- 已拒絕的Promise班巩,可以通過.catch方法或.then方法的第二個參數(shù)或try catch進行捕獲。
二嘶炭、Promise的方法
1.Promise.resolve(value):
返回一個Promise實例抱慌,并將它的狀態(tài)設(shè)置為已完成,同時將它的結(jié)果作為傳入onFulfilled函數(shù)的值眨猎。
2.Promise.reject(reason):
返回一個Promise實例抑进,并將它的狀態(tài)設(shè)置為已拒絕,同時將它的結(jié)果作為傳入onRejected函數(shù)的原因睡陪。
3.Promise.race([promise1,promise2,...]):
返回一個Promise實例寺渗,接受一個含多個Promise實例的數(shù)組,當其中一個Promise實例狀態(tài)改變時兰迫,就進入該狀態(tài)不可改變信殊。這里所有的Promise實例為競爭關(guān)系鬓催,只選擇第一個進入改變狀態(tài)的promise的值罗珍。
4.Promise.all([promise1,promise2,...]):
返回一個Promise實例该互,接受一個含多個Promise實例的數(shù)組碎赢,當所有Promise實例都成為已完成狀態(tài)時,進入已完成狀態(tài)证芭,否則進入已拒絕狀態(tài)唠亚。
5.Promise.allSettled():
返回一個Promise實例区丑,在所有給定的Promise都已經(jīng)fulfilled或rejected后返回對應(yīng)狀態(tài),并帶有一個對象數(shù)組橱野,每個對象表示對應(yīng)的Promise結(jié)果朽缴。
6.Promise.any():尚未被所有的瀏覽器完全支持
接收一個Promise可迭代對象,只要其中的一個 Promise 成功水援,就返回那個已經(jīng)成功的 Promise 密强。如果可迭代對象中沒有一個 promise 成功(即所有的 promises都失敗/拒絕),就返回一個失敗的 promise 和AggregateError類型的實例蜗元,它是 Error 的一個子類或渤,用于把單一的錯誤集合在一起。本質(zhì)上许帐,這個方法和Promise.all()是相反的。
三毕谴、實現(xiàn)Promise.all()
Promise.myAll = (list => {
return new Promise((resolve, reject) => {
let count = 0
const values = []
list.forEach((item, i) => {
Promise.resolve(item).then(res => {
values[i] = res
count++
if (count === list.length) {
resolve(values)
}
}, err => {
reject(err)
})
});
})
})