【高频面试题】(实现all 与race)

112 阅读1分钟

目录

  1. all实现
  2. race实现

一、all实现

  Promise.all1 = promiseArr => {
    let result = [];
    //声明一个计数器 每一个promise返回就加一
    let count = 0;
    return new Promise((resolve, reject) => {
        for (let i = 0; i < promiseArr.length; i++) {
            //这里用 Promise.resolve包装一下 防止不是Promise类型传进来
            Promise.resolve(promiseArr[i]).then(
                res => {
                    //这里不能直接push数组  因为要控制顺序一一对应
                    result[i] = res;
                    count++;
                    //只有全部的promise执行成功之后才resolve出去
                    if (count === promiseArr.length) {
                        resolve(result);
                    }
                },
                err => {
                    reject(err);
                }
            );
        }
    });
};

1) 测试 有一个reject

const p1 = Promise.resolve(1)
const p2 = Promise.reject(2)
const p3 = Promise.resolve(100)

Promise.all1([p1,p2,p3]).then(data=>{
    console.log('resolve:',data)
},err=>{
    console.log('then 中 reject:',err)
}).catch(err=>{
    console.log('catch 中 reject:',err)
}).then(a=>{console.log(1,a)})

image.png

2) 测试 全部resolve

const p1 = Promise.resolve(1)
const p2 = Promise.resolve(2)
const p3 = Promise.resolve(100)

Promise.all1([p1,p2,p3]).then(data=>{
    console.log('resolve:',data)
},err=>{
    console.log('then 中 reject:',err)
}).catch(err=>{
    console.log('catch 中 reject:',err)
}).then(a=>{console.log(1,a)})

image.png

二、race实现

  Promise.race1(promiseArr) {
    return new Promise((resolve, reject) => {
      for (let i = 0; i < promiseArr.length; i++) {
        Promise.resolve(promiseArr[i]).then(
          (res) => {
            //promise数组只要有任何一个promise 状态变更  就可以返回
            resolve(res);
          },
          (err) => {
            reject(err);
          }
        );
      }
    });
  }
}

1)测试

const p1 = new Promise((resolve, reject) => {
  setTimeout(reject, 3000, '1');
});
const p2 = new Promise((resolve, reject) => {
  setTimeout(reject, 2000, '2');
});
const p3 = new Promise((resolve, reject) => {
  setTimeout(reject, 1000, '3');
});


Promise.race([p1,p2,p3]).then(data=>{
    console.log('resolve:',data)
},err=>{
    console.log('then 中 reject:',err)
}).catch(err=>{
    console.log('catch 中 reject:',err)
})

image.png

总结

  • return new Promise 返回一个Promise的目的是为了 链式调用后续可以调用Promise原型上的then 和 catch 方法