千家信息网

如何理解JS中的Generator及协程

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"如何理解JS中的Generator及协程",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解JS中的Generator及协程"吧
千家信息网最后更新 2026年11月02日如何理解JS中的Generator及协程

这篇文章主要讲解了"如何理解JS中的Generator及协程",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解JS中的Generator及协程"吧!

生成器执行流程

什么是生成器函数?

生成器是一个带星号的"函数"(注意:它并不是真正的函数),可以通过yield关键字暂停执行和恢复执行的

举个例子:

function* gen() {   console.log("enter");   let a = yield 1;   let b = yield (function () {return 2})();   return 3; } var g = gen() // 阻塞住,不会执行任何语句 console.log(typeof g)  // object  看到了吗?不是"function"  console.log(g.next())   console.log(g.next())   console.log(g.next())   console.log(g.next())    // enter // { value: 1, done: false }  // { value: 2, done: false } // { value: 3, done: true } // { value: undefined, done: true }

由此可以看到,生成器的执行有这样几个关键点:

  1. 鸿蒙官方战略合作共建--HarmonyOS技术社区

  2. 调用 gen() 后,程序会阻塞住,不会执行任何语句。

  3. 调用 g.next() 后,程序继续执行,直到遇到 yield 程序暂停。

  4. next 方法返回一个对象, 有两个属性: value 和 done。value 为当前 yield 后面的结果,done 表示是否执行完,遇到了return 后,done 会由false变为true。

yield* 语法

当一个生成器要调用另一个生成器时,使用 yield* 就变得十分方便。比如下面的例子:

function* gen1() {     yield 1;     yield 4; } function* gen2() {     yield 2;     yield 3; }

我们想要按照1234的顺序执行,如何来做呢?

在 gen1 中,修改如下:

function* gen1() {     yield 1;     yield* gen2();     yield 4; }

这样修改之后,之后依次调用next即可。

生成器实现机制——协程

可能你会比较好奇,生成器究竟是如何让函数暂停, 又会如何恢复的呢?接下来我们就来对其中的执行机制——协程一探究竟。

什么是协程?

协程是一种比线程更加轻量级的存在,协程处在线程的环境中,一个线程可以存在多个协程,可以将协程理解为线程中的一个个任务。不像进程和线程,协程并不受操作系统的管理,而是被具体的应用程序代码所控制。

协程的运作过程

那你可能要问了,JS 不是单线程执行的吗,开这么多协程难道可以一起执行吗?

答案是:并不能。一个线程一次只能执行一个协程。比如当前执行 A 协程,另外还有一个 B 协程,如果想要执行 B 的任务,就必须在 A 协程中将JS 线程的控制权转交给 B协程,那么现在 B 执行,A 就相当于处于暂停的状态。

举个具体的例子:

function* A() {   console.log("我是A");   yield B(); // A停住,在这里转交线程执行权给B   console.log("结束了"); } function B() {   console.log("我是B");   return 100;// 返回,并且将线程执行权还给A } let gen = A(); gen.next(); gen.next();  // 我是A // 我是B // 结束了

在这个过程中,A 将执行权交给 B,也就是 A 启动 B,我们也称 A 是 B 的父协程。因此 B 当中最后return 100其实是将 100 传给了父协程。

需要强调的是,对于协程来说,它并不受操作系统的控制,完全由用户自定义切换,因此并没有进程/线程上下文切换的开销,这是高性能的重要原因。

感谢各位的阅读,以上就是"如何理解JS中的Generator及协程"的内容了,经过本文的学习后,相信大家对如何理解JS中的Generator及协程这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

线程 生成器 生成 函数 程序 例子 执行权 学习 控制 操作系统 任务 关键 内容 机制 系统 语句 过程 进程 切换 阻塞 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技行业发展 互联网科技保险 互联网与科技金融数据 科技互联网技术 百单互联网科技有限公司 甘肃拓世互联网科技有限公司 互联网之后的科技是什么 广州慧亚互联网科技怎么样 互联网公司科技股 链环科技传统企业怎么转型互联网 晋城互联网科技 风投北京互联网科技 宁波跨境商互联网科技有限公司 吉林省码上互联网科技电话 互联网时代科技型公司的机会 上海万顺科技互联网有限公司招聘 互联网领先科技活动 互联网科技收购价值 第三届互联网大会安防黑科技 互联网企业和网络科技有限公司 鸠鸠互联网科技 凡科互联网科技 互联网科技美容 哈尔滨新华互联网科技 深圳卡尔迅互联网科技有限公司怎么样 成都玖崟互联网科技有限公司乐商圈怎么样 栖莱科技互联网股份有限公司 科技互联网的核心竞争力 互联网科技新闻 恒生科技指数 中概互联网
0