Q20: Implement a polyfill for Promise.allSettled().
Answer
Promise.allSettled() waits until all input promises have settled, whether fulfilled or rejected. It returns an array describing each outcome in the same order as the input.
if (!Promise.myAllSettled) {
Promise.myAllSettled = function (iterable) {
return new Promise((resolve, reject) => {
let items;
try {
items = Array.from(iterable);
} catch (error) {
reject(error);
return;
}
if (items.length === 0) {
resolve([]);
return;
}
const results = new Array(items.length);
let remaining = items.length;
items.forEach((item, index) => {
Promise.resolve(item).then(
value => {
results[index] = {
status: "fulfilled",
value
};
},
reason => {
results[index] = {
status: "rejected",
reason
};
}
).then(() => {
remaining--;
if (remaining === 0) {
resolve(results);
}
});
});
});
};
}
Promise.myAllSettled([
Promise.resolve("success"),
Promise.reject("failure")
]).then(console.log);
Expected result
[
{ status: "fulfilled", value: "success" },
{ status: "rejected", reason: "failure" }
]
Explanation
Unlike Promise.all(), this method records rejections instead of rejecting the aggregate promise because an individual input rejects. The returned promise still rejects if the iterable itself cannot be consumed correctly.
Key Takeaways
- AllSettled records both fulfilled and rejected outcomes.
- The result array preserves input order and includes a status for every input.