构建异步工作流应以 promise.withresolvers() 为单元划分状态边界,用 then 链接串行、all/race 控制并行与竞态,错误导向预设降级路径,并暴露幂等控制句柄实现运行时干预。

构建复杂的异步工作流,核心不是堆砌 Promise,而是用它组织逻辑流向——让每一步的启动、等待、跳转和终止都可控、可观察、可干预。
明确状态边界,每个阶段独立持有 resolver
不要把整个流程塞进一个 Promise 里。应为每个关键状态(如“初始化中”“校验中”“提交中”“重试中”)分别调用 Promise.withResolvers() 创建专属的 { promise, resolve, reject }。这样:
• 后续状态只依赖前一状态的 resolve() 触发,而非时间或事件隐式驱动
• 某个阶段出错时,仅影响当前 resolver,不会污染其他分支
• 外部可随时调用 reject(new Error('timeout')) 强制退出该阶段,无需修改内部逻辑
用链式 then 实现线性流程,用 all/race 控制并行与竞态
串行任务直接靠 .then() 链接:上一环节 resolve 的值自动传给下一环节;并行任务则用 Promise.all([p1, p2, p3]) 等待全部完成,或用 Promise.race([timeout, apiCall]) 设置超时保护。例如:
• 先并发拉取用户基础信息和权限配置,再统一处理 → Promise.all([fetchUser(), fetchPerms()])
• 轮询接口时,同时发起请求和计时器,任一先完成即结束当前轮 → Promise.race([poll(), timeout(5000)])
错误不中断,而是导向预设降级路径
避免在中间环节用 catch() 吞掉错误后盲目继续。更合理的方式是:
• 在关键节点的 .then() 中主动判断结果是否有效,无效则 throw 或 reject
• 用 .catch() 统一捕获后,根据错误类型决定走向:重试、跳过、切换备用 API、或进入兜底状态
• 例如网络失败时 resolve 到 “retry” 状态,服务不可用时 reject 到 “offline” 状态,由状态机统一响应
暴露控制句柄,支持运行时干预
对外提供清晰的控制方法,比如 cancel()、skipTo('done')、injectError('mock failure')。这些方法内部只需调用对应阶段的 reject 或 resolve 即可。注意:
• 所有控制操作应幂等,重复调用不引发异常
• 取消后需清理关联资源(如 abort controller、清除定时器)
• 状态变更应同步更新外部可观测字段(如 workflow.status),便于调试与监控











