模拟实现Promise.race
一、前言
Promise.race 是es2015的Promise内置的一个静态方法,接受一个promisesArr 数组,返回一个新的promise:
- race 译为竞赛,一旦promiseArr数组中的其中一个promise 变为完成或者拒绝,就会返回该promise。
- 如果数组的某一项不是promise, 就是把该项封装为一个成功的promise,然后再参与竞争。
二、准备测试数据
const promisesSuccess = []; // 五个成功的promise 数组
const promises = []; // 随机的promise
for (let i = 0; i < 5; i++) {
// 成功的promise
promisesSuccess.push(
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`${i * 1000}--resolve`);
}, i * 1000);
})
);
// 随机promise
Math.random() > 0.1
? promises.push(
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`${i * 1000}--resolve`);
}, i * 1000);
})
)
: promises.push(
new Promise((resolve, reject) => {
setTimeout(() => {
reject(`${i * 1000}--reject`);
}, i * 1000);
})
);
}
三、实现Promise.race
Promise.myRace = (promiseArr) => {
return new Promise((resolve, reject) => {
promiseArr.forEach((item) => {
Promise.resolve(item).then(resolve, reject);
});
});
}
四、 测试
Promise.race(promisesSuccess).then(console.log, console.log);
Promise.race(promises).then(console.log, console.log);console.log(res);
执行结果: