核心是实现策略解耦的异步包装器:定义返回RetryDecision的策略接口,预置指数退避等策略;包装器用try/catch接管reject,依策略重试/降级/抛出;支持类封装动态setStrategy、上下文透传及TypeScript泛型推导。

要编写支持动态配置错误处理策略的异步包装器,核心是把“错误怎么处理”从代码逻辑中解耦出来,变成可运行时替换的策略对象,同时保持对 Promise 的自然链式调用和 await 兼容性。
定义可插拔的错误处理策略接口
策略应是一个函数,接收原始错误、重试次数、上下文等信息,返回一个明确指令:重试、丢弃、转换为新错误、或降级返回默认值。
- 策略函数签名建议为:
(error: unknown, attempt: number, context?: Record<string any>) => Promise<retrydecision></retrydecision></string> -
RetryDecision 可是枚举:
{ type: 'retry', delay?: number }、{ type: 'fail', error: Error }、{ type: 'fallback', value: T } - 预置几个常用策略:指数退避重试、静默降级、记录后抛出、仅网络错误重试等
构建通用异步包装器函数
包装器本身不执行业务逻辑,只接管 Promise 的 reject 流程,并按当前策略决定后续动作。
完整的Galileo AI平台 TypeScript/JS SDK 参考,用于评估、观察和保护 GenAI 应用。适用于构建 Node.js 或 TypeScript 项目。
- 接受目标异步函数(如
() => fetch(...))和策略函数作为参数 - 内部用
async/await+try/catch捕获异常,调用策略函数获得决策 - 若策略返回 retry,则用
setTimeout+ 递归调用自身(注意控制最大重试次数防死循环) - 若返回 fallback,直接
resolve默认值;若返回 fail,则reject新错误
支持运行时切换策略与上下文透传
策略不应硬编码在包装器调用点。可通过闭包、类实例属性或依赖注入方式实现动态绑定。
- 推荐用类封装:例如
const wrapper = new AsyncWrapper(fetchWithAuth),其.setStrategy()方法可随时更新策略 - 调用时允许传入额外 context 对象(如请求 ID、用户角色),策略函数可据此差异化响应
- 策略也可返回 Promise,支持异步判断(比如查远程配置中心是否开启熔断)
保持开发者体验友好
包装后的函数应与原函数签名一致(包括泛型类型),支持 TypeScript 类型推导和 IDE 自动补全。
- 使用泛型约束:包装器函数声明为
asyncWrapper<t>(fn: () => Promise<t>, ...): () => Promise<t></t></t></t> - 对 TypeScript 用户,策略类型需完整标注,使
setStrategy调用时能校验输入输出 - 提供简易快捷方法,如
.withRetry(3).withBackoff(1000)链式生成策略,降低使用门槛

















