JavaScript生成器实现协程的原理及用法
2026-05-21 20:20:55
0浏览
收藏
JavaScript生成器通过function*和yield关键字实现了协程的核心能力——执行流的暂停与恢复,支持手动控制、双向通信及状态保持,不仅能与Promise结合构建自动执行器来优雅处理异步操作(让异步代码形如同步),还超越async/await的局限,广泛应用于惰性求值、无限序列、复杂状态机等需精细调度执行流程的场景,至今仍是深入理解JavaScript运行机制与高级控制抽象的重要基石。

JavaScript中的生成器通过function*定义,配合yield关键字实现暂停与恢复执行的能力,这正是协程的核心特征。生成器函数返回一个可迭代的生成器对象,调用其next()方法才会执行内部代码,遇到yield时暂停,并将指定值返回。下一次调用next()时从暂停处继续,这种手动控制执行流程的方式让生成器可以模拟轻量级线程,即协程。
生成器的基本工作方式
生成器函数每次执行到yield就暂停,保存当前上下文,外部可通过next()传参来恢复并传递数据。
- 调用
gen.next(value)时,传入的value会成为上一个yield表达式的返回值 - 可以通过这种方式在生成器内外双向通信
- 适合用于异步流程控制或状态机管理
使用生成器实现异步协程
结合Promise和自动执行函数,可以让生成器像协程一样处理异步操作,避免回调嵌套。
- 定义一个自动执行器(如
run函数),递归调用next直到完成 - 每次
yield后面跟一个Promise,执行器等待其resolve后再继续 - 这样写出来的代码看起来是同步的,实际是异步执行
例如:
function run(genFunc) {
const gen = genFunc();
function next(val) {
const result = gen.next(val);
if (!result.done) {
result.value.then(next);
}
}
next();
}
<p>run(function* () {
const data = yield fetch('/api/data').then(res => res.json());
console.log(data); // 看起来像同步写法
});</p>与现代async/await的关系
ES2017引入的async/await本质上是生成器+Promise的语法糖,但更简洁、专一于异步处理。
async函数始终返回Promiseawait只能用于Promise,不能像yield那样灵活控制流程- 生成器用途更广,可用于惰性求值、无限序列等场景
基本上就这些。生成器提供了协程所需的暂停和恢复能力,虽然后来被async/await简化了异步写法,但在需要精细控制执行流的场合仍有价值。
理论要掌握,实操不能落!以上关于《JavaScript生成器实现协程的原理及用法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
淘宝订单发票怎么开?电子发票申请教程
- 上一篇
- 淘宝订单发票怎么开?电子发票申请教程
- 下一篇
- Excel快速提取身份证生日技巧教程
查看更多
最新文章
-
- 文章 · 前端 | 4分钟前 |
- CSS流式布局断点切换技巧
- 117浏览 收藏
-
- 文章 · 前端 | 4分钟前 |
- CSS文字破碎消失特效实现方法
- 200浏览 收藏
-
- 文章 · 前端 | 5分钟前 |
- HTML如何实现物流跟踪时间轴
- 297浏览 收藏
-
- 文章 · 前端 | 17分钟前 |
- 自定义 Babel 插件剔除生产调试代码
- 101浏览 收藏
-
- 文章 · 前端 | 20分钟前 |
- Set快速识别数组差异:前端Diff算法实战
- 273浏览 收藏
-
- 文章 · 前端 | 22分钟前 |
- 手动分段清理数组避免性能问题
- 400浏览 收藏
-
- 文章 · 前端 | 22分钟前 |
- JavaScript按唯一键分组累加数组教程
- 192浏览 收藏
-
- 文章 · 前端 | 33分钟前 |
- 数据流背压机制应对高负载任务解析
- 171浏览 收藏
-
- 文章 · 前端 | 38分钟前 |
- HTML表单分组优化技巧\_fieldset样式调整方法
- 292浏览 收藏

