Skip to content

手写 PromiseAll Promise.all

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

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);
            })
        }
    })
}

使用 Ts 的版本:

ts
function PromiseAll<T>(promises: Promise<T>[]): Promise<T[]> {
  const arr = Array.from(promises);
  let count = 0;
  const res: T[] = [];
  return new Promise((resolve, reject) => {
    for (let i = 0; i < arr.length; i++) {
      Promise.resolve(arr[i])
        .then((item) => {
          res[i] = item;

          if (++count === arr.length) {
            resolve(res);
          }
        })
        .catch((e) => reject(e));
    }
  });
}

测试用例

js
// 测试用例 1: 所有 Promise 都成功
let promises1 = [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)];

PromiseAll(promises1)
  .then((result) => {
    console.log(result); // 输出: [1, 2, 3]
  })
  .catch((error) => {
    console.error(error);
  });

// 测试用例 2: 一个 Promise 失败
let promises2 = [
  Promise.resolve(1),
  Promise.reject("error"),
  Promise.resolve(3),
];

PromiseAll(promises2)
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.error(error); // 输出: error
  });

// 测试用例 3: 空数组
let promises3 = [];

PromiseAll(promises3)
  .then((result) => {
    console.log(result); // 输出: []
  })
  .catch((error) => {
    console.error(error);
  });

// 测试用例 4: 混合值和 Promise
let promises4 = [1, Promise.resolve(2), 3];

PromiseAll(promises4)
  .then((result) => {
    console.log(result); // 输出: [1, 2, 3]
  })
  .catch((error) => {
    console.error(error);
  });
js
const PromiseAll = (promises) => {

  let arr = Array.from(promises);

  const len = arr.length;

  let count = 0;

  let res = [];
   return new Promise((resolve, reject)=>{
    for(let i=0;i<arr.length;i++){

      Promise.resolve(arr[i]).then((item)=>{
        res[i] = item;
        if(++count === len){
          resolve()
        }
      }).catch(()=>reject())
    }
   })
}
本站访客数 人次 本站总访问量