SOURCE

//设计要点
//1.需要校验参数是否是数组(不一定时数组 可能是其他可迭代的数据结构) 且是空数组时不进入for循环 而是直接resolved
//2.需要返回一个promise
//需要将数组里的非promise返回
function myPromiseAll(promiseArr) {
    // 如果传入的参数不是数组 或者是对象但是不是迭代器 则报错提示
   
    return new Promise((resolve, reject) => {
        //必须放在里面 放在外面如果输入的不是数组 则会报..isnot function的错误
         if(!Array.isArray(promiseArr) || typeof promiseArr[Symbol.iterator] !== 'function') 
        return reject(new Error('you must input a array'))
        //如果传入空数组 则立即resolved 不用进入for循环
        if(promiseArr.length === 0) resolve('the empty arr');
        //存放resolve结果以及已经resolve的数量
        let result = [];
        let resolvedCount = 0;
        let currentIndex = 0;//保存原位置 防止因为resolve时间不同而导致乱序
        //使用 for..of 因为参数不一定数组 而是可迭代的数据
        for(const promise of promiseArr) {
            //使用index保存该promise的索引防止乱序
            let index = currentIndex;
            currentIndex ++;
            Promise.resolve(promise)
            .then(value => {
                //result.push(value) 不能使用push push 可能因为resolve的时间不同而乱序
                result[index] = value
                resolvedCount ++;
                //如果全部resolve 则将result resolve
                if(resolvedCount === promiseArr.length) {
                    resolve(result)
                }
            }).catch(e => reject(e)) //否则报错
            
            
        }
    })
}


// const p1 = new Promise((res, rej) => {
//     setTimeout(() => {
//         res(23)
//     }, 4000)
// })

// const p2 = new Promise((res, rej) => {
//     setTimeout(() => {
//        res('23')
//     }, 2000)
// })

// const p3 = new Promise((res, rej) => {
//     setTimeout(() => {
//         rej('p3')
//     }, 3000)
// })

// const test = myPromiseAll([p1, p2, p3])
//     .then(res => console.log(res))
//     .catch(e => console.log(e))

// console.log(test);
//手写 promise.race
// Promise.myRace = function(arr){
//   return new Promise((resolve,reject) => {
//     for(let item of arr){
//       Promise.resolve(item).then(res => {
//         resolve(res)
//       }).catch(err => {
//         reject(err)
//       })
//     }
//   })
// }
// let p1 = new Promise(resolve => {
//   setTimeout(() => {
//     resolve(1)
//   },100)
// })
// let p2 = new Promise((resolve,reject) => {
//   setTimeout(() => {
//     reject(2)
//   })
// })
// let p3 = new Promise((resolve,reject) => {
//   setTimeout(() => {
//     resolve(3)
//   })
// })

// Promise.myRace([p1,p2,p3]).then(res => {
//   console.log(res);
// }).catch(err => {
//   console.log(err);
// })
//promiseAllStelled
/**
   * 等待所有的Promise有结果后
   * 该方法返回的Promise完成
   * 并且按照顺序将所有结果汇总
   * @param {Iterable} proms
   */
  Promise.myAllSettled=function(proms) {
    const ps = [];
    for (const p of proms) {
      ps.push(
        Promise.resolve(p).then(
          (value) => ({
            status: 'fulfilled',
            value,
          }),
          (reason) => ({
            status: 'rejected',
            reason,
          })
        )
      );
    }
    return Promise.all(ps);
  }
const pro = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(3);
  }, 1000);
});

Promise.allSettled([pro, Promise.resolve(1), Promise.reject(2)]).then(
  (data) => {
    console.log(data);
  }
);

Promise.myAllSettled([pro, Promise.resolve(1), Promise.reject(2)]).then(
  (data) => {
    console.log(data);
  }
);
console 命令行工具 X clear

                    
>
console