ES6学习—Generator函数
2016-12-06 20:11
309 查看
基本概念
Generator是ES6提供的一种异步编程的解决方案。形式上有两个特征。一是,
function关键字和函数名之间有个星号;二是,函数内部使用
yield语句,定义不同的内部状态。
function* helloGenerator(){ yield 'hello'; yield 'world'; return 'ending'; } var hw = helloGenerator();
必须调用对象的
next方法,使得指针移向下一个状态。
Generator函数是分段执行的。
yield语句是暂停执行的标记,而
next方法可以恢复执行。
hw.next() // { value: 'hello', done: false } hw.next() // { value: 'world', done: false } hw.next() // { value: 'ending', done: true } hw.next() // { value: undefined, done: true }
yield语句
遍历器对象的next方法的运行逻辑如下:
(1)遇到
yield语句,就暂停执行后面的操作,并将紧更着
yield后面表达式的值,作为返回的对象
value的属性值。
(2)下次调用next方法时,再继续往下执行,直到遇到下一个
yield语句的。
(3)如果没有遇到新的
yield语句,就一直运行到函数结束,直到
return语句为止,并将
return语句后面的表达式的值,作为返回的对象的
value值。
(4)如果该函数没有
return语句,则返回的对象的
value属性值为
undefined。
Generator函数可以不用yield语句,这时就变成一个单纯的暂缓执行函数。
function* f(){ console.lof('execute'); } var generator = f(); setTimeout(function(){ generator.next(); },2000);
上面代码如果
f是普通函数,再为变量
generator赋值的时候就已经执行了。但是,函数
f是一个
Generator函数,就变成只有调用
next方法时,函数
f才会执行。
另外注意,
yield语句不能再普通函数里面,否则会报错。
Generator.prototype.return()
return方法可以返回指定的值,并终结了
Generator函数。
function* gen(){ yield 1; yield 2; yield 3; } var g = gen(); g.next(); //{value:1,done:false} g.return('foo'); //{value:"foo",done:true} g.next(); //{value:undefined,done:true}
如果
Generator函数内部有
try ... finally代码块,那么
return方法会推迟到
finally代码块执行完成再执行。
function* numbers(){ yield 1; try{ yield 2; yield 3; } finally{ yield 4; yield 5; } yield 6; } var g = numbers() g.next(); //{value:1,done:false} g.next(); //{value:2,done:false} g.return(7);//{value:4,done:false} g.next();//{value:5,done:false} g.next();//{value:7,done:true}
相关文章推荐
- ES6个人学习整理(一)——编译环境搭建
- 【javascript】ES6 特性 菜鸟学习笔记
- ES6学习——新的语法:函数参数默认值
- ES6学习——新的语法:Symbol API介绍
- ES6学习——新的语法:for..of 循环
- ES6学习——新的语法:Symbols——Symbol.iterator
- ES6学习——新的语法:对象解构(Object Destructuring)
- ES6学习——新的语法:数值字面量扩展(Number Literal Extensions)
- ES6学习——新的语法:Symbol概述
- ES6 学习笔记
- ES6学习——新的语法:块级作用域概述
- ES6学习——新的语法:函数参数Spread
- ES6学习——新的语法:Rest
- ES6学习——新的语法:let
- 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise
- 跟我学习javascript的最新标准ES6
- ES6学习——环境搭建
- ES6学习——新的语法:数组解构(Array Destructuring)
- ES6学习——新的语法:其它Well-Known Symbols
- ES6学习——新的语法:Template Literals