3. 实现Promise.allSettled
Sunny-117 opened this issue · comments
/**
* 等待所有的Promise有结果后
* 该方法返回的Promise完成
* 并且按照顺序将所有结果汇总
* @param {Iterable} proms
*/
Promise.allSettled=function(proms) {
const ps = [];
for (const p of proms) {
ps.push(
MyPromise.resolve(p).then(
(value) => ({
status: FULFILLED,
value,
}),
(reason) => ({
status: REJECTED,
reason,
})
)
);
}
return MyPromise.all(ps);
}
Promise.myAllSettled = function (proms) {
return new Promise((resolve, reject) => {
let settledCount = 0; //状态已经确定的promise数
let count = 0; //promise总数
const result = [];
for (const prom of proms) {
let i = count;
count++;
Promise.resolve(prom).then(
(data) => {
settledCount++;
result[i] = {
status: "fullfilled",
value: data,
};
},
(reason) => {
settledCount++;
result[i] = {
status: "rejected",
reason,
};
}
).finally(() => {
if(settledCount >= count){
resolve(result)
}
});
}
});
};
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);
}
);
Promise.prototype.mySettled = function (promises) {
return new Promise((resolve) => {
const data = [],
len = promises.length;
let cnt = 0;
for (let i = 0; i < len; i++) {
const promise = promises[i];
Promise.resolve(promise)
.then(
(res) => {
data[i] = { status: "fulfilled", value: res };
},
(error) => {
data[i] = { status: "rejected", reason: error };
}
)
.finally(() => {
if (cnt === len) resolve(data);
});
}
});
};
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) =>
setTimeout(reject, 100, "foo")
);
const promises = [promise2, promise1];
Promise.allSettled(promises).then((results) =>
results.forEach((result) => console.log(result))
);
function allSettled(promises) {
return Promise.all(promises.map(p => Promise.resolve(p).then(
value => ({ status: 'fulfilled', value }),
reason => ({ status: 'rejected', reason })
)));
}
Promise.allSettled = function (ites) {
let count = 0;
let result = [];
return new Promise((resolve, reject) => {
for (let i = 0; i < ites.length; i++) {
Promise.resolve(ites[i])
.then((val) => {
count++;
result[i] = val;
if (count === ites.length) {
resolve(result);
}
})
.catch((val) => {
count++;
result[i] = val;
if (count === ites.length) {
resolve(result);
}
});
}
});
};