手動實現promise.all

任務:手動實現一個promise.all數組

第一步: 觀察

promise.all 的特色:promise

  • 入參是個由Promise實例組成的數組
  • 返回值是個promise,由於可使用.then
  • 若是所有成功,狀態變爲resolved, 而且返回值組成一個數組傳給回調
  • 但凡是有一個失敗,狀態變爲rejected, 並將error返回給回調

第二步:代碼實現

function diPromiseAll(promises){
    return new Promise((resolve, reject)=>{
        // 參數判斷
        if(!Array.isArray(promises)){
            throw new TypeError("promises must be an array")
        }
        let result = [] // 存放結果
        let count = 0 // 記錄有幾個resolved
        promises.forEach((promise, index) => {
            promise.then((res)=>{
                result[index] = res
                count++
                count === promises.length && resolve(result) // 判斷是否已經完成
            }, (err)=>{
                reject(err)
            })
        })
    })
}

複製代碼

第三步:驗證

let p1 = Promise.reject(1),
    p2 = Promise.resolve(2),
    p3 = Promise.resolve(3);

diPromiseAll([p1, p2, p3]).then((res)=>{
    console.log(res, 'res')
}, (err)=>{
    console.log(err, 'err')
})

// [1, 2, 3]

let p1 = Promise.reject(1),
    p2 = Promise.resolve(2),
    p3 = Promise.resolve(3);
diPromiseAll([p1, p2, p3]).then((res)=>{
    console.log(res, 'res')
}, (err)=>{
    console.log(err, 'err')
})
// 1 "err"
複製代碼
相關文章
相關標籤/搜索