// fake(name, ms, ok) settles after ms milliseconds: fulfilled with name, or rejected.
const fake = (name, ms, ok = true) =>
new Promise((resolve, reject) =>
setTimeout(() => (ok ? resolve(name) : reject(new Error(`${name} failed`))), ms)
);
console.log("all:", await Promise.all([fake("a", 30), fake("b", 10)]));
try {
await Promise.all([fake("a", 30), fake("b", 10, false)]);
} catch (error) {
console.log("all failed:", error.message);
}
const settled = await Promise.allSettled([fake("a", 30), fake("b", 10, false)]);
console.log("allSettled:", settled.map((r) => r.status));
console.log("any:", await Promise.any([fake("mirror 1", 30), fake("mirror 2", 10, false), fake("mirror 3", 20)]));
try {
await Promise.any([fake("x", 10, false), fake("y", 20, false)]);
} catch (error) {
console.log("any failed:", error.name, error.errors.map((e) => e.message));
}
const timeout = (ms) =>
new Promise((resolve, reject) => setTimeout(() => reject(new Error(`timed out after ${ms} ms`)), ms));
console.log("race:", await Promise.race([fake("quick", 10), timeout(50)]));
try {
await Promise.race([fake("slow", 80), timeout(20)]);
} catch (error) {
console.log("race failed:", error.message);
}