生成器实现异步逻辑的核心是用 yield 显式标记暂停点,配合执行器自动处理 promise 和错误,使代码线性可读、错误可捕获、数据流清晰。

用生成器写异步逻辑,核心是把“等待”显式地表达出来,让代码像同步一样线性可读,而不是嵌套回调或堆砌 then。关键不是语法炫技,而是借助 yield 暂停执行、交出控制权,再由执行器(如 co 或手写的 runner)恢复——这样就把异步的“断点”可视化了。
用 yield 标记暂停点,而非隐藏状态
生成器本身不执行异步操作,它只是产出待执行的异步任务(比如 Promise)。真正易读的关键,在于每个 yield 后面都对应一个清晰的业务动作,而不是塞一堆表达式或副作用:
- ✅ 推荐:
yield fetch('/api/user')—— 一眼看出这是在取用户数据 - ❌ 避免:
yield Promise.all([fetch(...), api.post(...)]).then(...)—— 把组合逻辑和等待混在一起,破坏线性流
如果需要并行请求,拆成多个 yield 行或提前发起 Promise(不 yield),再统一 yield 等待结果,语义更干净。
搭配轻量执行器,避免手动调用 next()
原生生成器需手动驱动,容易写出冗长又易错的 runner。用成熟的小型执行器(如 co、gen-run,或几行自己写的)能自动处理 Promise 返回值并继续执行:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 返回 Promise → 自动
resolve后调用next(value) - 抛出错误 → 自动
throw到生成器内,可用try/catch捕获
例如:co(function* () { const user = yield fetch('/user').then(r => r.json()); console.log(user); }) —— 就像写同步代码一样自然。
错误处理要落在生成器内部,别甩给外层
异步出错时,Promise 被 reject,执行器会自动 throw 进生成器。所以直接用 try/catch 包住 yield 行即可,无需层层 .catch:
try { const data = yield api.get('/order'); } catch (err) { console.error('下单失败', err); }- 错误类型和位置一目了然,和同步函数的异常流完全一致
慎用状态共享,优先靠参数传递数据
生成器函数体内的变量会在多次 next() 调用间保持,容易隐式依赖时序或产生闭包陷阱。更安全的做法是让每一步 yield 的结果作为下一步的输入:
- ✅ 清晰:
const user = yield getUser(); const profile = yield getProfile(user.id); - ❌ 隐晦:
let userId; function* g() { yield getUser().then(u => userId = u.id); yield getProfile(userId); }—— 读起来像在猜上下文
保持单向数据流,既利于测试,也方便未来迁移到 async/await。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










