通用函数包装器通过高阶函数接收原函数并返回增强版函数,需满足参数透传、返回值保留、this上下文维持;支持同步/异步统一处理,可配置before/after/onerror回调,并适用于fetch重试日志等场景。

编写通用函数包装器的核心是利用高阶函数思想:接收原函数作为参数,返回一个增强后的新函数。关键在于保持原函数签名不变,同时在执行前后注入逻辑。
基础包装器结构
最简形式需满足三个条件:正确传递参数、保留返回值、维持 this 上下文。
- 使用 ...args 捕获任意数量参数,避免硬编码参数列表
- 用 call 或 apply 确保被包装函数的 this 指向与调用时一致
- 直接返回原函数执行结果,不破坏原有行为
支持异步与同步统一处理
现代 JavaScript 中函数可能同步或异步(返回 Promise),包装器应自动适配:
- 检查返回值是否为 Promise:用 value instanceof Promise 判断
- 若为 Promise,在 then/catch 中插入增强逻辑(如日志、错误重试)
- 若为普通值,直接处理并返回
这样同一包装器可安全用于 fetch 请求函数或纯计算函数。
可配置的增强能力
通过传入配置对象让包装器更灵活:
- 添加 before 回调,在执行前运行(如参数校验、缓存检查)
- 添加 after 回调,在成功后运行(如结果格式化、埋点上报)
- 添加 onError 回调,在失败时运行(如错误归因、降级策略)
- 配置 name 字段便于调试时识别包装后的函数
实际示例:带重试与日志的 fetch 包装器
比如封装一个自动重试 3 次、记录耗时和状态的 fetch 调用:
- 包装器内部用 async/await,统一处理 Promise 流程
- 每次请求前打开始日志,结束后记录耗时与响应状态
- 捕获网络错误或非 2xx 响应,按策略重试(间隔递增)
- 最终抛出最后一次失败错误,或返回成功响应
这种写法让业务代码只需调用 wrapper(fetch)(),无需重复写重试和日志逻辑。











