学习链接
40+ 大厂常考 JS 手写题系列【摸鱼必备】(不该用 push,见测试)
Promise.allSettled

Promise.myAllSettled = promiseArr => {return new Promise((resolve, reject) => {if (!promiseArr[Symbol.iterator]) {throw new TypeError(`${promiseArr} is not iterable`);}if (!Array.isArray(promiseArr)) {promiseArr = Array.from(promiseArr);}const resArr = [];let count = 0;promiseArr.forEach((element, index) => {Promise.resolve(element).then(valule => {resArr[index] = {status: 'fulfilled',valule}count++;if (count === promiseArr.length) resolve(resArr);},reason => {resArr[index] = {status: 'rejected',reason}count++;if (count === promiseArr.length) resolve(resArr);});});})};
测试
iterator 相关测试案例见这里
注意 setTimeout 设定的时间与输出数组的顺序。
const p1 = new Promise((resolve, reject) => {setTimeout(resolve, 1000, 'p1');});const p2 = new Promise((resolve, reject) => {setTimeout(reject, 500, 'p2');});const p3 = new Promise((resolve, reject) => {setTimeout(reject, 1500, 'p3');}).catch(e => e);Promise.myAllSettled([p1, p2, p3]).then(res => console.log(res));Promise.allSettled([p1, p2, p3]).then(res => console.log(res));// [// {status: 'fulfilled', value: 'p1'},// {status: 'rejected', reason: 'p2'},// {status: 'fulfilled', value: 'p3'}// ]
