Open Sunny-117 opened 1 year ago
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); } }); } }); };