Prmise.all的簡單實現

注意點

  • 入參一般是個由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

https://zhuanlan.zhihu.com/p/60287801

https://zhuanlan.zhihu.com/p/41502945

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章