Generator 本身不直接处理异步,但通过 yield 暂停执行并配合执行器(如 co)自动处理 Promise,曾是 JavaScript 简化异步流程的关键过渡方案,为 async/await 奠定基础。

Generator 本身不直接处理异步,但配合 yield 和手动/自动的执行器(如 co 或现代 async/await 的思想源头),它曾是 JavaScript 中简化异步流程的关键过渡方案。它的核心价值在于:把异步操作“暂停”和“恢复”的控制权交还给开发者,让回调嵌套或 Promise 链变得线性可读。
用 yield 暂停执行,把异步动作当“同步步骤”写
Generator 函数返回一个迭代器,每次调用 next() 就运行到下一个 yield 处并暂停。你可以让 yield 后跟一个 Promise,再由执行器捕获这个 Promise、等待它 resolve/reject 后继续推进迭代器。
例如:
function* fetchUserData() {const user = yield fetch('/api/user');
const posts = yield fetch(`/api/posts?uid=${user.id}`);
return { user, posts };
}
这里没有 await,也没有 .then(),但逻辑是顺序的——关键在于外部执行器要负责:
• 拿到 yield 出来的 Promise
• 等它 settle 后,用 it.next(result) 把结果送回去
• 出错时用 it.throw(err) 推进
搭配 co 库或手写简易执行器,自动处理 Promise 流程
像老牌的 co 库就是专为 Generator 设计的执行器:它接收一个 Generator 函数,自动遍历、等待每个 yield 后的 Promise,并将结果传回,错误也统一抛出。
一个极简执行器思路:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
- 调用
gen.next()得到{ value, done } - 若
value是 Promise,用.then(res => next(res))继续 - 若
done为 true,返回最终值;否则递归调用next
这样你只管写 *函数,执行细节被封装,异步代码看起来就像同步脚本。
它是 async/await 的重要铺垫,现在更推荐用后者
Generator + 执行器的模式虽然清晰,但需要额外依赖或自己维护执行逻辑,且语法略重(function*、yield、执行器调用)。ES2017 引入的 async/await 本质是 Generator + 自动执行器的语法糖,原生支持、更简洁、调试更友好。
上面的例子用 async/await 就是:
const user = await fetch('/api/user');
const posts = await fetch(`/api/posts?uid=${user.id}`);
return { user, posts };
}
语义一致,无需额外库,错误用 try/catch 即可捕获,是当前标准实践。
小结:Generator 的价值在“可控暂停”,不在替代 Promise
它不简化异步的本质(仍是事件循环 + Promise 微任务),而是提供一种可中断的函数模型。理解它有助于掌握 async/await 底层机制,也能在某些特殊场景(如自定义协程、状态机、惰性序列)中发挥优势。日常开发中,优先使用 async/await;读老项目或深入原理时,Generator 仍值得一看。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










