柯里化本身不直接提供重试能力,但能配合高阶函数构造带重试逻辑的函数:先用柯里化固定重试参数,再返回封装重试逻辑的新函数,接收并自动重试原始异步操作。

柯里化本身不直接提供重试能力,但它能配合高阶函数灵活构造带重试逻辑的函数。核心思路是:先用柯里化固定重试参数(如最大次数、延迟时间),再返回一个封装了重试逻辑的新函数,该函数接收原始异步操作并自动执行重试。
柯里化 + 重试逻辑封装
把重试行为抽象为一个高阶函数 retry,它接受配置参数并返回一个可复用的重试器;再用柯里化预设常用配置,比如 retry3Times = retry(3, 1000)。
- 每次调用返回的函数会尝试执行传入的异步操作,失败则按策略重试
- 使用
Promise链 +setTimeout或Promise.delay控制间隔 - 捕获异常后判断是否继续重试,避免无限循环
基础实现示例
以下是一个轻量、可柯里化的重试函数:
const retry = (maxRetries, delayMs) => {
return (fn) => async (...args) => {
let lastError;
for (let i = 0; i setTimeout(r, delayMs));
}
}
}
throw lastError;
};
};
<p>// 柯里化用法:预设参数
const retry3Times = retry(3, 1000);
const fetchWithRetry = retry3Times(fetch);</p><p>// 使用时只需传入原始调用参数
fetchWithRetry('/api/data')
.then(data => console.log(data))
.catch(err => console.error('最终失败:', err));
</p>
支持更灵活配置的柯里化版本
可以进一步让 retry 支持部分参数柯里化(如只传 maxRetries,延迟后续补):
const retry = (maxRetries) => (delayMs = 1000) => (fn) => async (...args) => {
let lastError;
for (let i = 0; i setTimeout(r, delayMs));
}
}
}
throw lastError;
};
<p>// 分步柯里化
const retry5 = retry(5);
const retry5With2s = retry5(2000);
const apiCall = retry5With2s(axios.get);
</p>
注意事项与增强点
实际使用中需关注几个关键细节:
- 避免对非幂等操作(如 POST)盲目重试,建议在封装前做语义判断
- 可加入指数退避(exponential backoff),将
delayMs * Math.pow(2, i)替代固定延迟 - 支持自定义重试条件,例如只对特定 HTTP 状态码或错误类型重试
- 考虑添加日志或钩子(如
onRetry),便于调试和监控
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











