async 本身不提供自愈,但通过 try/catch 捕获异常、await 实现可重试/降级逻辑、Proxy 拦截校验恢复、按错误类型分级响应,构建出“尝试→重试→兜底”三级自愈体系。

async 封装本身不直接提供“自愈”,但它为构建自愈能力提供了关键的控制流基础:让错误可捕获、可等待、可重试、可降级。真正的自愈来自在 async 函数中主动设计恢复路径,而非依赖语法自动修复。
用 try/catch 捕获并接管失败路径
await 会把 Promise rejection 转为同步可捕获的异常,这是自愈的第一步——不让错误直接冒泡中断流程。
- 每个关键 await 后都应有明确的 fallback 逻辑,比如网络失败时读本地缓存
- 避免只 console.error 后就 return;要给出替代结果(如空数组、默认值、上一快照)
- 示例:若 fetch 失败,可 fallback 到 localStorage.getItem('user') 或返回 { id: null, name: '游客' }
封装 retry + backoff 的可重试异步单元
把单次请求包装成带重试机制的 async 函数,失败后自动延时重试,而非交由上层反复调用。
- 用 while 循环 + setTimeout 控制重试次数与间隔,避免阻塞主线程
- 每次失败记录错误类型(网络超时 / 401 / 503),便于差异化策略(如 401 触发 token 刷新)
- 重试耗尽后,再触发降级逻辑,形成“尝试→重试→兜底”三级防御
结合 Proxy 状态树实现变更级自愈
在 Proxy 的 set 拦截中嵌入 async 校验与恢复逻辑,让状态写入本身就具备韧性。
- 写入前 await checkPermission(key, value),拒绝非法变更,避免脏状态
- 写入后 await persistToDB(value),失败则 revert 到 target[key] 原值,并触发通知
- 配合快照机制(如 deepClone 上一有效 state),可在异常时一键 restore
统一错误分类与响应式降级策略
自愈不是盲目重试,而是根据错误语义选择最优恢复动作。
- 网络类错误(TypeError / AbortError)→ 重试 + 缓存回退
- 权限类错误(401 / 403)→ 触发登录态刷新,再重放原操作
- 数据类错误(422 / 解析失败)→ 记录日志,返回默认结构,不影响 UI 渲染
- 所有未预期错误 → 触发全局 error boundary,展示友好提示并上报

















