模拟实现 Promise.race

回顾 Promise.race 的定义

Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。

关键点:

  • 接受的是 promise 类数组
  • 返回一个 promise 实例
  • 返回的 promise 实例的 resolve 或 reject 的回调结果要求都是最先得到的

具体实现

function myPromiseRace(promiseArr) {
     // 如果传入的参数不是可迭代类型
     if (promiseArr[Symbol.iterator] === undefined) {
        return Promise.reject("params is not a iteratorable type")
    }

    // 转为数组进行遍历
    promiseArr = Array.from(promiseArr);

    return new Promise((resolve, reject) => {
        for(let promise of promiseArr) {
            promise.then(res=>{
                resolve(res);
            }).catch(err=>{
                reject(err);
            })
        }
    })
}

使用一下:

const pArr = [
    Promise.resolve(1),
    new Promise(resolve=>{
        setTimeout(()=>{
            resolve(2);
        },200)
    }),
    Promise.resolve(3),
]

const pArr_1 = [
    new Promise(resolve=>{
        setTimeout(()=>{
            resolve(1);
        },200)
    }),
    Promise.reject(2),
]

myPromiseRace(pArr).then(res=>{
    console.log(res);
}).catch(err=>{
    console.log(err);
})
// 1

myPromiseRace(pArr_1).then(res=>{
    console.log(res);
}).catch(err=>{
    console.log(err);
})
// 2

myPromiseRace(Promise.resolve(1)).then(res=>console.log(res)).catch(err=>console.log(err));
// params is not a iteratorable type

你可能感兴趣的:(模拟实现 Promise.race)