注意點
- 入參一般是個由Promise實例組成的數組,但是也可以不是數組,但必須具有 Iterator 接口,且返回的每個成員都是 Promise 實例。若參數如果不是 Promise 實例,就會先調用Promise.resolve()方法,將參數轉爲 Promise 實例,再進一步處理。
- 返回值是個promise,因爲可以使用.then
- 如果全部成功,狀態變爲resolved, 並且返回值組成一個數組傳給回調
- 但凡有一個失敗,狀態變爲rejected, 並將error返回給回調
簡單實現
Promise.all = (promisesArr) => { // 返回Promise return new Promise((resolve, reject) => { let dataArr = new Array(promisesArr.length); let count = 0; for (let i = 0; i < promisesArr.length; i++) { // 在 .then 中收集數據,並添加 .catch,在某一個 Promise 遇到錯誤隨時 reject。 // 這樣,在最外面調用 Promise.all().catch() 時也可以 catch 錯誤信息 // 判斷當前這個元素是否爲Promise對象,不是則轉爲Promise對象 let currentPromise = (promisesArr[i] instanceof Promise) ? promisesArr[i] : Promise.resolve(promisesArr[i]); currentPromise.then(res => { dataArr[index] = data; count++; // 如果數據收集完了,就把收集的數據 resolve 出去 if (count === promisesArr.length) resolve(dataArr); }).catch(err => { //如果某一個失敗,promise.all()立即執行reject回調。 //但剩餘的promise依舊繼續執行,只不過對promise.all的結果不會產生影響了 reject(err) }); } }) }
注意⚠️:dataArr添加時用下標而不用數組時爲了防止順序錯亂
參考
https://blog.csdn.net/MichelleZhai/article/details/104475521