Skip to content

手写 PromiseAll Promise.all

最直接的思路, 依次执行即可; 不能用 push, 因为返回的时间不好控制;

  • 使用return new Promise的情况:
    • 聚合多任务,多个promise。
    • 外面包一层,手动控制resolve。
js

const PromiseAll = (arr) => {
    const tasks = Array.from(arr);
    const len = arr.length;
    return new Promise((resolve, reject)=>{

        let count =0;
        let result = [];
        if(len === 0){
            resolve([]);
        }
        for(let i=0;i<len;i++){
            Promise.resolve(tasks[i]).then((item)=>{
                result[i]=item;
                count++;
                if(count === len){
                    resolve(result);
                }
            }).catch(e=>{
                reject(e);
            })
        }
    })
}
js

const PromiseAll = (promises) => {
  const tasks = Array.from(promises);
  const len = tasks.length;

  return new Promise((resolve, reject)=>{

    let count = 0;
    let res = [];
    if(len===0) resolve([]);

    for(let i=0;i<len;i++){
      Promise.resolve(tasks[i]).then((val)=>{
        
        res[i] = val;
        count++;

        if(count===len){
          resolve(res);
        }
      }).catch((err)=>{
        reject(err); // 一票否决。
      })
    }

  })
}
本站访客数 人次 本站总访问量