ES6学习之Generator函数
概念:可以把Generator 函数理解成状态机(封装了多个内部状态)或者是一个遍历器对象生成函数
写法:Generator函数的定义跟普通函数差不多,只是在function关键字后面加了一个星号
function* test(){
yield 'hello';
yield 'world';
return 'done'
}
var te = test(); //什么都没有
te.next(); //{ value: 'hello', done: false }
te.next(); //{ value: 'world', done: false }
te.next(); //{ value: 'done', done: true }
te.next(); //{ value: undefined, done: true }
说明:1)不管内部有没有yield语句,调用Generator函数,该函数并不立即执行,也不返回函数执行结果,而是返回一个指向内部状态的generator对象,也可以看作是一个遍历器对象。
2)必须调用该对象的next方法,让函数继续走下去,使指针移向下一个状态。每当碰到yield语句,内部指针就停下来,直到下一次调用next()才开始执行。
3)如果没有再遇到yield 则返回return的值为value的属性值
4)如果没有return表达式,则将undefined作为value的属性值
5)Generator函数中可以没有yield表达式,此时,Generator函数表示一个暂缓执行函数
Generator函数的next()方法:(next方法内可以传入参数,传入的参数将作为上一个yield表达式的返回值(意思是第一个next传入参数无效))
function* gen(a) {
let b = yield (a + 1);
return b * 2;
}
let g = gen(1);
g.next(); // Object {value: 2, done: false}
g.next(); // Object {value: NaN, done: true}
let ge = gen(1);
ge.next(); // Object {value: 2, done: false}
ge.next(3); // Object {value: 6, done: true}
上面第二次调用g.next()返回的value为NaN而不是2*2,说明yield表达式没有返回值,或者说yield表达式总是返回undefined
for...of遍历Generator函数内的状态:
function *foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
return 6;
}
for (let v of foo()) {
console.log(v);
}
// 1 2 3 4 5
return语句不会被遍历
yield* 表达式(用来在一个 Generator 函数里面执行另一个 Generator 函数。)
function* foo() {
yield 'a';
yield 'b';
}
function* bar() {
yield 'x';
yield* foo();
yield 'y';
}
for (let v of bar()){
console.log(v);
}
// "x" "a" "b" "y"
Generator函数的异步编程:
- 异步函数的同步实现
function* loadUI() {
showLoadingScreen();
yield loadUIDataAsynchronously();
hideLoadingScreen();
}
var loader = loadUI(); //这一步什么都不执行
loader.next() //执行函数showLoadingScreen()和loadUIDataAsynchronously()
loader.next() //执行函数hideLoadingScreen
- 流程控制
function* execute() {
let value1;
let value2;
let value3;
let value4;
yield value1 = step1();
yield value2 = step2(value1);
yield value3 = step3(value2);
yield value4 = step4(value3);
console.log(value4);
}
function step1() {
return `step1_start`;
}
function step2(value) {
return `step2_${value}`;
}
function step3(value) {
return `step3_${value}`;
}
function step4(value) {
return `step4_${value}`;
}
for(var item of execute()); //step4_step3_step2_step1_start
注意:yield总是返回undefined,但此处并不是直接返回yiled,而是给yield后面的变量赋值,故能运算
ES6学习之Generator函数的更多相关文章
- ES6学习之箭头函数
ES6学习笔记--箭头函数 箭头函数一直在用,最近突然想到重新看一下箭头函数的用法,所以这里做一些总结. 箭头函数长这个样子: let fn = a => a++; // fn 是函数名, a= ...
- 转: ES6异步编程:Generator 函数的含义与用法
转: ES6异步编程:Generator 函数的含义与用法 异步编程对 JavaScript 语言太重要.JavaScript 只有一根线程,如果没有异步编程,根本没法用,非卡死不可. 以前,异步编程 ...
- ES6中的Generator函数
今天小编发现一个es6中的新概念,同时也接触到了一个新关键字yeild,下面我就简单和大家聊聊es6中的generator函数.大家还可以关注我的微信公众号,蜗牛全栈. 一.函数声明:在functio ...
- es6学习笔记-async函数
1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...
- ES6 - Note7:Generator函数
Generator函数 1.Generator函数是ES6增加的异步编程解决方案之一,与普通的函数行为完全不同,类似于一个状态机,内部封装了多个状态. 在函数定义的形式上,跟普通函数差不多,有两处不同 ...
- ES6入门之Generator函数
Generator Generator函数是ES6提供的一种异步编程解决方案,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历器对象,也就是说,Gen ...
- es6学习笔记6--Generator 函数
基本概念 Generator函数有多种理解角度.从语法上,首先可以把它理解成,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历器对象,也就是说,Gen ...
- js-ES6学习笔记-Generator函数的异步应用
1.ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 Generator 函数将 JavaScript 异步编程带入了一个全新的阶段. 2.所谓 ...
- js-ES6学习笔记-Generator函数的应用
1.异步操作的同步化表达 Generator函数的暂停执行的效果,意味着可以把异步操作写在yield语句里面,等到调用next方法时再往后执行.这实际上等同于不需要写回调函数了,因为异步操作的后续操作 ...
随机推荐
- 在Ubuntu安装go编译环境
在Ubuntu安装go编译环境 好记性不如烂笔头,所以趁热打铁记录下golang编译环境的安装过程. 首先下载一些依赖包: sudo apt-get install bison ed gawk gcc ...
- linux 5-sort,uniq,tar,split
十二. 行的排序命令sort: 1. sort命令行选项: 选项 描述 -t 字段之间的分隔符 -f 基于字符排序时忽略大小写 -k 定义排序的域字段,或者是基于域字段的部分数据进行排序 - ...
- ADO.NET概述
xml这类文件它是.net变成环境中优先使用的数据访问借口. ADO.NET传输的数据都是XML格式的 ADO.NET是一组用于和数据源惊醒交互的面向对象类库 数据源:通常是各种数据库,但文本.exc ...
- 第11条:用zip函数同时遍历两个迭代器
核心知识点: (1)内置的zip函数可以平行地遍历多个迭代器. (2)python3中地zip相当于生成器,会在遍历过程中逐次产生元祖.而python2中地zip则是直接把这些元祖完全生成好,并一次性 ...
- 【leetcode刷题笔记】Single Number
题目: Given an array of integers, every element appears twice except for one. Find that single one. No ...
- 326 集合 ,数据类型的补充 ,copy , 编码之间的转换
一.数据类型补充1,对于元组:如果只有一个元素,并且没有逗号,此元素是什么数据类型,改表达式就是什么数据类型. tu = () tu1 = (,) print(tu,type(tu)) #1 < ...
- Linux Network Namespace
Linux Network Namespaces Linux kernel在2.6.29中加入了namespaces,用于支持网络的隔离,我们看一下namespace是如何使用的 创建与配置 创建一个 ...
- <再看TCP/IP第一卷>TCP/IP协议族中的最压轴戏----TCP协议及细节
题外话:刚刚过去的半个月实在是忙得我喘不过来气,虽然手里还压着几个项目得在期末考试之前做完,但是想想还是更新一下随笔,稍微换个心情.另外小吐槽一下那些在博客园里原封不动抄书当随笔的人,唉真是....算 ...
- DB2常见错误
+098 01568 动态SQL语句用分号结束+100 02000 没有找到满足SQL语句的行+110 01561 用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统+111 0159 ...
- linux共享库加载
参考自: <<程序员的自我修养--链接.装载与库>> 第八章 Linux共享库的组织 以下截取部分内容 (这本书比较好的讲解了从程序的链接,装载,到运行) 共享库的兼容性 li ...