- 返回的是一个 Promise 实例
- 参数是数组或者具备 Iterator 接口的数据,数组中的每项为一个 Promise 实例,如果不是则使用 Promise.resolve 转换成 Promise实 例
- 实例的状态由数组每项的 Promise 状态决定,当其全部是 fulfilled 时,实例的状态才会变成 fulfilled,如果有一个是 rejected,实例的状态即为 rejected,返回值即为第一个被 rejected 的实例的返回值
实现如下:
Promise.all = function (promises) {
return new Promise((resolve, reject) => {
let result = [], cnt = 0
if (promises.length === 0) {
resolve(result)
return
}
promises.forEach((promise, index) => {
Promise.resolve(promise).then(res => {
result[index] = res
cnt++
if (cnt === promise.length) {
resolve(result)
}
}).catch(err => {
reject(err)
})
})
})
}
当参数是具备 Iterator 接口时的,此处以 Set 作为示例
const set = new Set([])
const p1 = new Promise(resolve => {
setTimeout(() => {
resolve(1)
}, 1000)
})
const p2 = new Promise(resolve => {
setTimeout(() => {
resolve(2)
}, 2000)
})
set.add(p1)
set.add(p2)
Promise.all(set).then(result => console.log(result)) // [1, 2]
本文暂时没有评论,来添加一个吧(●'◡'●)