用对象字面量重构异步控制链,核心是将条件分支、状态映射、回调跳转等逻辑收拢为键值结构,实现可读、可查、可维护的扁平化控制流。

用对象字面量重构异步控制链,核心是把分散的条件分支、状态映射、回调跳转等逻辑,收拢为可读、可查、可维护的键值结构,从而压低代码嵌套深度和认知负荷。
用状态-处理器映射替代 if/else 或 switch 异步分支
当异步流程需根据响应状态(如 code、type、step)决定下一步行为时,硬编码判断易膨胀。改用对象字面量做“状态到处理函数”的直接映射,消除嵌套,提升扩展性。
- 定义一个纯数据对象,key 是业务状态标识,value 是对应异步处理器函数(返回 Promise)
- 执行时通过 response.status 或 result.type 直接索引调用,失败兜底用 ?? 或 in 操作符校验
- 新增状态只需加一项键值对,不碰主流程,避免漏改分支或顺序错乱
将多层嵌套的 .then 链转为扁平化任务表
长链式 .then(x => x.then(...)) 不仅难调试,还隐含执行顺序强耦合。可预先声明任务序列对象,每个 key 对应一个步骤名,value 是该步的异步操作函数,再用 reduce 串行驱动。
- 任务对象本身不执行,只描述“第几步做什么”,例如 { validate: api.validate, save: api.save, notify: sendEmail }
- 用 Object.entries(taskMap).reduce((p, [step, fn]) => p.then(() => fn()), Promise.resolve()) 实现可控串行
- 跳过某步?删 key 即可;复用某步?直接引用已有 fn;加日志?统一在 reduce 内包裹 try/catch
用配置对象统一管理异步重试、超时与降级策略
重试次数、间隔、超时毫秒、失败 fallback 函数等参数若散落在各处 fetch 调用里,会重复且难收敛。提取为字面量配置,作为 options 传入封装好的 asyncRunner 工具函数。
- 配置示例:{ retry: 2, timeout: 8000, fallback: () => ({ data: null, error: 'offline' }) }
- asyncRunner(fn, config) 内部统一处理 reject 分支:计数重试、setTimeout 控制超时、最终触发 fallback
- 不同接口只需传不同 config,核心重试逻辑零重复,策略变更改一处即全局生效
避免对象字面量沦为新“上帝对象”
字面量是组织工具,不是堆砌容器。失控的膨胀反而加重理解成本。
- 单个对象聚焦一个维度:只管状态分发,或只管任务编排,或只管策略配置,不混责
- 键名用语义化业务词(如 'payment_failed'),不用技术词(如 'http_402')
- 函数值保持无副作用、可测试;复杂逻辑仍应封装进独立模块,字面量只负责“连线”

















