es6 --- 使用生成器交替执行
考虑以下场景:
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 --- 使用生成器交替执行相关推荐
- 【完整代码】使用Semaphore实现线程的交替执行打印 A1B2C3D4E5
import java.util.concurrent.Semaphore;/**使用Semaphore实现线程的交替执行打印 A1B2...Semaphore 基于AQS(内部维护了一个队列)可以用 ...
- Java案例:两个线程交替执行
目录 一.准备工作 二.执行任务 任务1.两个线程,一个打印A到Z,一个打印1到26,交替执行
- Goroutine交替执行的相关问题与方法
多个Goroutine交替执行输出 文章目录 多个Goroutine交替执行输出 两个协程交替打印1-100的奇偶数 使用channel作为信号传递实现 使用runtime让协程竞争CPU 使用syn ...
- python两个线程交替执行_python 实现两个线程交替执行
我就废话不多说,直接看代码吧! import threading import time def a(): while True: lockb.acquire() print('a') locka.r ...
- es6 Promise,生成器函数,async
生成器函数 简单使用: // 生成器就是一个特殊的函数// 异步编程 纯回调函数 node gs ajax mongodbfunction* gen() {// console.log(111);yi ...
- 深入浅出JS—20 生成器控制函数执行
上一篇文章介绍并实现了迭代器,生成器是一种特殊的迭代器, 特殊在于生成器是由生成器函数得到的,并不是我们构造的对象.对于生成器函数,ES6有一套专门的规范和关键字定义 思考:JS中函数执行可以中断吗? ...
- 并发 线程交替执行_并发与并行的区别
简要可以理解为: (1)并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. (2)并行是在不同实体上的多个事件,并发是在同一实体上的多个事件. (3)在一台处理器上& ...
- java两个线程交替执行
比如有一个数,需要两个线程对其交替操作,代码如下 public class ThreadDemo {public static void main(String[] args) {Message me ...
- java线程交替执行_Java synchronized线程交替运行实现过程详解
背景 用两个线程交替输出A-Z和1-26,即一个线程输出A-Z,另一个线程输出1-26 而且是交替形式 线程1输出A--线程二输出1 线程1输出B--线程二输出2 线程1输出C--线程二输出3 以此类 ...
最新文章
- 51单片机怎么学啊?有推荐的线上网课和书籍么?
- 计算机视觉与深度学习 | 基于Matlab双目视觉之深度估计(视频中人到相机的距离)(附源代码)
- mysql xa 演示_mysql的XA事务恢复过程详解
- 第七季4:网络telnet调试、海思proc文件系统调试接口
- 操作系统:高响应比优先调度算法(HRRN)Java代码实现
- python 网络调试助手
- 大话MIMO-OFDM联合工作实现过程
- 3个小故事让你搞懂什么是敏捷开发模式!
- 关于STM32中的引脚重映射
- ES7和 ES8 一览
- day 37 ajax跨域 浏览器同源测略
- 啥叫企业管理?王健林告诉你
- 关于python,如何更优雅地用%占位符
- LTE/EPC中,MME怎么找到UE的HSS的?
- EBS之挂载表单的详细步骤
- MJ系列之手写代码汇总
- 爬虫实例之豆瓣电影排行榜
- html传递汉字参数转换,url中如何传递中文信息呢?
- 做区块链联盟链开发前期准备
- 一文读懂cpu cache
热门文章
- PIC32单片机harmony开发环境 - i2c例程和代码分析
- linux games账号,linux for games
- linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高
- java整合html_springBoot整合mybatis、jsp 或 HTML
- Python 中的numpy 库
- final+static
- 20172325 2018-2019-1 《Java程序设计》第二周学习总结
- mysql_表_操作
- Behave用户自定义数据类型
- Windows 8 系统快捷键热键列表收集