手写 Promise.all、Promise.race 和 Promise.retry
请手动实现 Promise.all、Promise.race 以及一个带重试机制的 Promise.retry 函数。
回答
古法程序员
Promise.all 实现:
Promise.myAll = function(promises) {
return new Promise((resolve, reject) => {
const results = [];
let completed = 0;
if (promises.length === 0) return resolve([]);
promises.forEach((p, i) => {
Promise.resolve(p).then(
val => {
results[i] = val;
if (++completed === promises.length) resolve(results);
},
reject // 任一失败直接 reject
);
});
});
};
Promise.race 实现:
Promise.myRace = function(promises) {
return new Promise((resolve, reject) => {
for (const p of promises) {
Promise.resolve(p).then(resolve, reject);
}
});
};
Promise.retry 实现:
Promise.retry = function(fn, retries = 3, delay = 1000) {
return new Promise(async (resolve, reject) => {
for (let i = 0; i < retries; i++) {
try {
const result = await fn();
return resolve(result);
} catch (err) {
if (i === retries - 1) return reject(err);
await new Promise(r => setTimeout(r, delay * (i + 1)));
}
}
});
};
// 使用:重试请求最多 3 次
Promise.retry(() => fetch('/api/data').then(r => r.json()), 3, 1000);