generator 的可中断特性专用于简化异步流程控制,而非重构同步逻辑;它通过 yield 显式标记异步等待点,配合自动执行器实现线性书写、同步错误处理与清晰堆栈。

Generator 的可中断特性不是用来“重构嵌套同步逻辑”的——因为同步逻辑本身不存在嵌套阻塞问题,也不需要中断恢复。真正需要它的是由异步操作引发的、表面同步实则层层嵌套的控制流,比如多层回调、Promise 链式调用中难以追踪的分支与错误路径。
明确适用场景:异步流程 ≠ 同步嵌套
所谓“错综复杂的嵌套逻辑”,常见于以下情况:
- 多个 API 请求依次依赖(如先查用户,再查详情,再查订单)
- 条件分支中混杂异步判断(如“若权限不足则加载配置,否则跳过”)
- 循环中逐个处理异步任务(如批量上传文件并等待每个响应)
这些逻辑在回调或 Promise 写法下容易变成横向拉长或纵向嵌套,而 Generator 并不改变执行顺序,而是把“等待点”显式标记出来,让代码回归线性阅读节奏。
用 yield 显式标出暂停点,剥离执行与调度
关键不是把同步代码硬拆成 yield,而是识别出哪些操作实际是异步的,并用 yield 将其“腾空”:
- 每个 yield 后面接一个 Promise,代表“这里要等一个异步结果”
- 函数体保持从上到下的自然语序,比如
const user = yield fetchUser(id); const profile = yield fetchProfile(user.id); - 不需要手动管理 then 链或嵌套回调,暂停由 yield 控制,恢复由 next 触发
搭配自动执行器,避免手写 next 调用
手动调用 next() 并传入结果既繁琐又易错。实际项目中应封装或使用成熟执行器(如 co 库或简易 runner):
- 执行器监听每个 yield 返回的 Promise
- Promise resolve 后自动调用 next(value),reject 则 throw 进生成器内部
- 这样开发者只需专注业务逻辑,无需关心迭代器状态流转
错误处理回归同步直觉
异步错误常散落在各个 .catch 或回调参数里。Generator 中可直接用 try/catch 包裹 yield 链:
try { const a = yield asyncOp1(); const b = yield asyncOp2(a); }- 任意一步失败,都会被外层 catch 捕获,无需为每个异步操作单独写错误分支
- 堆栈更清晰,调试时能准确定位是哪一次 yield 出了问题











