本文转载自微信公众号「前端三元同学」,作者神三元。转载本文请联系前端三元同学公众号。
我们注重客户提出的每个要求,我们充分考虑每一个细节,我们积极的做好成都做网站、网站建设服务,我们努力开拓更好的视野,通过不懈的努力,成都创新互联公司赢得了业内的良好声誉,这一切,也不断的激励着我们更好的服务客户。 主要业务:网站建设,网站制作,网站设计,微信小程序,网站开发,技术开发实力,DIV+CSS,PHP及ASP,ASP.Net,SQL数据库的技术开发工程师。
生成器(Generator)是 ES6 中的新语法,相对于之前的异步语法,上手的难度还是比较大的。因此这里我们先来好好熟悉一下 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 }
由此可以看到,生成器的执行有这样几个关键点:
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及协程真正理解?
网页路径:http://www.gawzjz.com/qtweb2/news44/11294.html
成都网站建设公司_创新互联,为您提供全网营销推广、标签优化、商城网站、ChatGPT、Google、软件开发
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联