考虑以下场景:

var a = 1;
var b = 2;function foo(){a++;b = b * a;a = b + 3;
}function bar(){b--;a  = 8 + b;b = a * 2;
}foo();
bar();
console.log(a, b);   // 11 22bar();
foo();
console.log(a, b);    // 183 180

对于上面的两个函数foo和bar,它们中的任何一个,一旦开始了就会一直执行下去直至完毕.
倘若,我们想在foo中a++后,暂停一下在去执行bar中的某个语句… 可以使用ES6提供的yield语句.
改变如下:

var a = 1;
var b = 2;function *foo(){    // *是生成器的标志a++;yield;b = b * a;a = (yield b) +3;
}function *bar(){b--;yield;a = (yield 8) + b;b = a * (yield 2);
}// 调用:foo执行完,在执行bar()
var s1 = foo();   // 初始化迭代器.
s1.next();
console.log(a, b);  // 2 2
s1.next();
console.log(a, b);  // 2 4// 还有最后一个 a = (yield b) + 3;
s1.next();   // "预计"执行后会得到 7 4
console.log(a, b);  // 实际上  NaN  4// 诶????
// 实际执行yield b时,并得不到b的值因此会返回NaN. 于是a就是NaN// 改进如下(foo中有2个yield, 因此会有3个next)
var s1 = foo();
var val1 = s1.next().value;
console.log(a, b);
val1 = s1.next(val1).value;
console.log(a, b);
val1 = s1.next(val1).value;
console.log(a, b);// 运行bar,(bar中有3个yield,会有4个next调用)
var s2 = bar();
var val2 = s2.next().value;
console.log(a, b);
val2 = s2.next(val2).value;
console.log(a, b);
val2 = s2.next(val2).value;
console.log(a, b);
val2 = s2.next(val2).value;
console.log(a, b);


可以看到,和正常函数执行结果是一样的…
还注意到.上述好多赋值语句是重复的,因此可以考虑构造一个辅助函数step,用于将yield返回的值原样的传入.

// step
function step(gen){var it = gen();var last;return function(){last = it.next(last).value;}
}

接下来使用step,先执行bar,后执行foo

var s1 = step(bar);
var s2 = step(foo);s1();  //  1   1
s1();  //  1   1
s1();  //  9   1
s1();  //  9   18
s2();  //  10  18
s2();  //  10  180
s2();  //  183 180

回归主题,交替执行bar和foo

var s1 = step(foo);
var s2 = step(bar);s2();  // b--  ,yield
s2();  // yield 8
s1();  // a++, yield
s2();  // a = 8 + b, yield 2
s1();  // b= b * a,  yield b
s1();  // a = b + 3
s2();  // b = a * 2

可以看到,bar 和foo 都经过了多次的停止与启动,且它们之间进行了交替操作.
参考《你不知道的JavaScript》(中卷)P241~P242

es6 --- 使用生成器交替执行相关推荐

  1. 【完整代码】使用Semaphore实现线程的交替执行打印 A1B2C3D4E5

    import java.util.concurrent.Semaphore;/**使用Semaphore实现线程的交替执行打印 A1B2...Semaphore 基于AQS(内部维护了一个队列)可以用 ...

  2. Java案例:两个线程交替执行

    目录 一.准备工作 二.执行任务 任务1.两个线程,一个打印A到Z,一个打印1到26,交替执行

  3. Goroutine交替执行的相关问题与方法

    多个Goroutine交替执行输出 文章目录 多个Goroutine交替执行输出 两个协程交替打印1-100的奇偶数 使用channel作为信号传递实现 使用runtime让协程竞争CPU 使用syn ...

  4. python两个线程交替执行_python 实现两个线程交替执行

    我就废话不多说,直接看代码吧! import threading import time def a(): while True: lockb.acquire() print('a') locka.r ...

  5. es6 Promise,生成器函数,async

    生成器函数 简单使用: // 生成器就是一个特殊的函数// 异步编程 纯回调函数 node gs ajax mongodbfunction* gen() {// console.log(111);yi ...

  6. 深入浅出JS—20 生成器控制函数执行

    上一篇文章介绍并实现了迭代器,生成器是一种特殊的迭代器, 特殊在于生成器是由生成器函数得到的,并不是我们构造的对象.对于生成器函数,ES6有一套专门的规范和关键字定义 思考:JS中函数执行可以中断吗? ...

  7. 并发 线程交替执行_并发与并行的区别

    简要可以理解为: (1)并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. (2)并行是在不同实体上的多个事件,并发是在同一实体上的多个事件. (3)在一台处理器上& ...

  8. java两个线程交替执行

    比如有一个数,需要两个线程对其交替操作,代码如下 public class ThreadDemo {public static void main(String[] args) {Message me ...

  9. java线程交替执行_Java synchronized线程交替运行实现过程详解

    背景 用两个线程交替输出A-Z和1-26,即一个线程输出A-Z,另一个线程输出1-26 而且是交替形式 线程1输出A--线程二输出1 线程1输出B--线程二输出2 线程1输出C--线程二输出3 以此类 ...

最新文章

  1. 51单片机怎么学啊?有推荐的线上网课和书籍么?
  2. 计算机视觉与深度学习 | 基于Matlab双目视觉之深度估计(视频中人到相机的距离)(附源代码)
  3. mysql xa 演示_mysql的XA事务恢复过程详解
  4. 第七季4:网络telnet调试、海思proc文件系统调试接口
  5. 操作系统:高响应比优先调度算法(HRRN)Java代码实现
  6. python 网络调试助手
  7. 大话MIMO-OFDM联合工作实现过程
  8. 3个小故事让你搞懂什么是敏捷开发模式!
  9. 关于STM32中的引脚重映射
  10. ES7和 ES8 一览
  11. day 37 ajax跨域 浏览器同源测略
  12. 啥叫企业管理?王健林告诉你
  13. 关于python,如何更优雅地用%占位符
  14. LTE/EPC中,MME怎么找到UE的HSS的?
  15. EBS之挂载表单的详细步骤
  16. MJ系列之手写代码汇总
  17. 爬虫实例之豆瓣电影排行榜
  18. html传递汉字参数转换,url中如何传递中文信息呢?
  19. 做区块链联盟链开发前期准备
  20. 一文读懂cpu cache

热门文章

  1. PIC32单片机harmony开发环境 - i2c例程和代码分析
  2. linux games账号,linux for games
  3. linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高
  4. java整合html_springBoot整合mybatis、jsp 或 HTML
  5. Python 中的numpy 库
  6. final+static
  7. 20172325 2018-2019-1 《Java程序设计》第二周学习总结
  8. mysql_表_操作
  9. Behave用户自定义数据类型
  10. Windows 8 系统快捷键热键列表收集