【莞式服务】手写实现+测试用例
- 利用Promise.resolve静态方法可以很方便的对入参进行转化
- 当入参中某个promise被拒绝时整体直接拒绝,并抛出拒绝值
const promiseAll = (...prs) => {
let resArr = [],
count = 0;
return new Promise((resolve, reject) => {
for (let i = 0; i < prs.length; i++) {
// 处理当传入对象不是promise的情况
// 利用promise.resolve将传入对象展开
Promise.resolve(prs[i])
.then((res) => {
resArr[i] = res;
count++;
if (count === prs.length) {
resolve(resArr);
}
})
// 如果其中有promise被拒绝,直接reject
.catch((e) => reject(e));
}
});
};
// 测试
let pr1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("hello");
}, 2000);
});
let pr2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("world");
}, 2000);
});
let rejectPr = new Promise((resolve, reject) => {
setTimeout(() => {
reject("opps");
}, 4000);
});
promiseAll(pr1, pr2, rejectPr)
.then((res) => {
console.log("all is over", res);
})
.catch((err) => {
// something is wrong opps
console.log("something is wrong", err);
});
// 直接传入原始值也是ok的
promiseAll(1, 2, "HAH", "LALAL")
.then((res) => {
console.log("all is over", res);
})
.catch((err) => {
// all is over [ 1, 2, 'HAH', 'LALAL' ]
console.log("something is wrong", err);
});