实现Promise.race

62 阅读1分钟

模拟实现Promise.race

一、前言

Promise.race 是es2015的Promise内置的一个静态方法,接受一个promisesArr 数组,返回一个新的promise:

  1. race 译为竞赛,一旦promiseArr数组中的其中一个promise 变为完成或者拒绝,就会返回该promise。
  2. 如果数组的某一项不是promise, 就是把该项封装为一个成功的promise,然后再参与竞争。

二、准备测试数据

const promisesSuccess = []; // 五个成功的promise 数组
const promises = []; // 随机的promisefor (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);

执行结果:

image.png