推荐答案
// www.javascriptcn.com code example
function retry(fn, times, delay) {
return new Promise((resolve, reject) => {
const attempt = (remainingAttempts) => {
fn()
.then(resolve)
.catch((error) => {
if (remainingAttempts > 0) {
setTimeout(() => attempt(remainingAttempts - 1), delay);
} else {
reject(error);
}
});
};
attempt(times);
});
}本题详细解读
1. 函数定义
retry(fn, times, delay) 是一个用于重试异步操作的函数。它接受三个参数:
fn: 一个返回Promise的异步函数。times: 重试的次数。delay: 每次重试之间的延迟时间(以毫秒为单位)。
2. 实现逻辑
- Promise 封装:函数返回一个
Promise,这意味着调用者可以使用.then()和.catch()来处理成功或失败的情况。 - 递归重试:
attempt是一个递归函数,用于尝试执行fn。如果fn失败,并且还有剩余的重试次数,则会在指定的延迟后再次尝试。 - 重试次数控制:
remainingAttempts参数用于控制剩余的重试次数。每次重试后,remainingAttempts减 1,直到为 0 时停止重试。 - 延迟执行:使用
setTimeout来实现每次重试之间的延迟。
3. 使用示例
function fetchData() {
return fetch('https://api.example.com/data')
.then(response => response.json());
}
retry(fetchData, 3, 1000)
.then(data => console.log('Data fetched:', data))
.catch(error => console.error('Failed after retries:', error));在这个示例中,fetchData 是一个异步函数,retry 会尝试最多 3 次,每次间隔 1 秒。如果最终成功,则输出数据;如果失败,则输出错误信息。