//设计要点
//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