登录
首页 >  文章 >  前端

JavaScript生成器实现协程的原理及用法

时间:2026-05-21 20:20:55 396浏览 收藏

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

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函数始终返回Promise
  • await只能用于Promise,不能像yield那样灵活控制流程
  • 生成器用途更广,可用于惰性求值、无限序列等场景

基本上就这些。生成器提供了协程所需的暂停和恢复能力,虽然后来被async/await简化了异步写法,但在需要精细控制执行流的场合仍有价值。

理论要掌握,实操不能落!以上关于《JavaScript生成器实现协程的原理及用法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>