目录
Promise.all(iterable)方法
- 接收的参数为promise数组,返回一个新的Promise实例,当iterable参数内的所有的promise都fulfilled或者参数中不包含Promise时,状态变成fulfilled。如果参数中有一个失败的,此回调失败,返回第一个失败的promise返回的结果
const p1 = Promise.resolve(2)
const p2 = Promise.resolve(Promise.resolve(3))
const p3 = Promise.resolve(Promise.reject(4))
const p4 = new Promise((resolve) => {
setTimeout(() => {
resolve(5)
}, 1000)
})
const pAll = Promise.all([p4, 7, p1, p2])
pAll.then(
(values) => {
console.log('all value', values)
},
(reason) => {
console.log('all reason', reason)
}
)
//输出 [5,7,2,3]
实现promise.all(iterable)方法
Promise.all = function (promises) {
let values = new Array(promises.length) //用来保存所有成功value的数组
//用来保存成功promise的数量
let resolvedCount = 0
return new Promise((resolve, reject) => {
// 遍历获取每个promise的结果
promises.forEach((p, index) => {
Promise.resolve(p).then(
(value) => {
// 成功数量+1
resolvedCount++
//p成功,将成功的value保存到value中
values[index] = value
// 如果全部成功了,将return的promise改为成功
if (resolvedCount === promises.length) {
resolve(values)
}
},
(reason) => {
reject(reason)
}
)
})
})
}
Promise.race(iterable)方法
- Promise.race(iterable)返回一个promise,一旦迭代器中的某个promise成功或失败,就返回一个成功或失败的promise
示例:
const p1 = Promise.resolve(2)
const p2 = Promise.resolve(Promise.resolve(3))
const p3 = Promise.resolve(Promise.reject(4))
const p4 = new Promise((resolve) => {
setTimeout(() => {
resolve(5)
}, 1000)
})
const p5 = Promise.reject(6)
const pRace = Promise.race([p4, p5, p3, p1, p2])
pRace.then(
(value) => {
console.log('race value', value)
},
(reason) => {
console.log('race reason', reason)
}
)
//输出 6 因为p5 先返回一个失败的promise
实现:
/*
Promise的函数对象的race方法
返回一个promise,其结果由第一个完成的promise决定
*/
Promise.race = function (promises) {
// 返回一个promise
return new Promise((resolve, reject) => {
promises.forEach((p, index) => {
Promise.resolve(p).then(
(value) => {
//一旦有成功,将return 变为成功
resolve(value)
},
(reason) => {
//一旦有失败,将return变为失败
reject(reason)
}
)
})
})
}