JavaScript生成器实现协程的原理及用法
时间:2026-05-21 20:20:55 396浏览 收藏
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学习网公众号吧!
相关阅读
更多>
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
最新阅读
更多>
-
117 收藏
-
200 收藏
-
297 收藏
-
101 收藏
-
273 收藏
-
400 收藏
-
192 收藏
-
171 收藏
-
292 收藏