yield重构嵌套多条件判断的核心是解耦“做什么”与“什么时候做”,将深层嵌套转为线性、可读、可测的步骤序列,由轻量执行器统一处理分支决策与异常流转。

用 yield 重构嵌套多条件判断,核心不是“让步”或“切换线程”,而是把控制流从深层嵌套中抽离出来,变成线性、可读、可测的步骤序列。它不改变执行模型,只重塑表达方式——让“做什么”和“什么时候做”解耦,让分支逻辑回归业务语义,而非被回调或 Promise 链裹挟。
识别并封装决策点,而非执行动作
遗留代码中常见的 if (res.status === 401) → redirectLogin() else if (res.status === 404) → showNotFound() … 这类判断,本质是“根据响应决定下一步”。yield 不该写成 if/else 块,而应封装为一个纯异步操作,把判断权交给执行器:
- yield api.fetchUser(id) → 执行器拿到完整响应后,统一查表映射:401 → throw authError,404 → yield { type: 'fallback', data: defaultUser }
- 避免在 generator 内部写 res.status === 200;那属于流程策略,不是生成器职责
- 每个 yield 表达式只返回一个 Promise 或可迭代对象,保持语义单一
用 yield 组织条件分支链,而非嵌套 return
当逻辑需按角色、状态、类型等多维条件跳转时,传统写法易形成 return 嵌套或中间变量堆积。yield 可将其转为显式步骤流:
- yield { decision: 'role_check', userId }; 执行器查 DB 后 next({ role: 'admin' }),触发后续 yield adminDashboardData()
- yield { decision: 'feature_flag', key: 'new_checkout' }; 执行器查配置中心,返回 enabled: true 后走新流程,否则 yield legacyCheckoutFlow()
- 所有分支路径都通过 next(value) 或 throw(error) 显式驱动,调用方一眼看清流转图谱
并行 + 动态分支:用 Promise.all 和 yield from 管理组合逻辑
多个独立条件需同时校验(如权限+配额+地域限制),或分支结果本身是动态生成的(如从规则引擎加载策略列表),可用:
- yield Promise.all([checkPermission(), checkQuota(), checkRegion()]) → 一次性获取全部结果,由执行器聚合判断是否放行
- Python 中用 yield from ruleEngine.loadPolicies(userId) → 把策略加载也变成惰性流,每条策略 yield 一个 handler,避免预加载全量规则
- JS 中可 yield* subGenerator() 实现类似委托,但注意需配合自定义 runner 处理 throw/close 透传
搭配轻量执行器,隔离调度与业务
不需要引入 co 或 redux-saga。一个约 25 行的 runGenerator 就够用:
- 自动处理 yield 出的 Promise,成功则 next(data),失败则 throw(err)
- 支持向 generator 注入上下文(如 logger、retryConfig)
- 统一加日志:每步 yield 前打 “→ 步骤 X 开始”,next 后打 “← 步骤 X 完成”
- 后续加重试、超时、降级,只需改执行器,generator 函数体零改动











