Promise.all

56 阅读1分钟

Promise.all

// 参数为数组
Promise.myAll = function(list){
    let results = [] // 记录结果的数组
    let count = 0 // 代表成功的数量
    // 返回值为Promise
    return new Promise((resolve,reject)=>{
        list.map((item,index)=>{
            // 这里使用Promise.resolve()将不是Promise的转为Promise
            Promise.resolve(item).then((data)=>{
                // 成功时调用
                results[index] = data
                count++
                if(count >= list.length){
                    resolve(results)
                }
            },
            (reason)=>{
                // 失败时调用
                reject(reason)
            })
        })
    })
}

// 验证
const promise1 = Promise.resolve(3)
const promise2 = 42
const promise3 = new Promise((resolve, reject) => {
	setTimeout(resolve, 100, 'foo')
})
Promise.myAll([promise1, promise2, promise3]).then(values => {
	console.log(values)
})

Promise.allSettled

Promise.myAllSettled = list => {
    let results = []
    let count = 0
    return new Promise((resolve, reject) => {
        list.map((item, index) => {
            Promise.resolve(item).then(
                data => {
                    // 成功时执行
                    results[index] = { status: 'fulfilled', val: data }
                    count++
                    if (count >= list.length) {
                            resolve(results)
                    }
                },
                reason => {
                    // 失败时执行
                    results[index] = { status: 'rejected', val: reason }
                    count++
                    if (count >= list.length) {
                            resolve(results)
                    }
                }
            )
        })
    })
}

// 验证
Promise.myAllSettled([
    Promise.resolve(33),
    new Promise(resolve => setTimeout(() => resolve(66), 0)),
    99,
    Promise.reject(new Error('一个错误')),
]).then(values => console.log(values))