温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解JS中的Generator及协程

发布时间:2021-10-26 11:09:23 来源:亿速云 阅读:127 作者:iii 栏目:web开发

这篇文章主要讲解了“如何理解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及协程这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI