博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20170710-Generator
阅读量:5870 次
发布时间:2019-06-19

本文共 1922 字,大约阅读时间需要 6 分钟。

基本概念

理解

Generator函数是ES 6提供的一种异步编程解决方案。从语法上,可以将Generator函数理解为一个状态机,它封装了多个内部状态。执行Generator函数会返回一个遍历器对象,也就是说Generator函数除了是一个状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历Generator函数内部的每一个状态。

为什么使用

Generator最大的好处就是函数可以被暂停执行并保持上下文,这个运行方式在处理那些需要暂停的任务时非常有用,而被维持的上下文是为了在将来对运行环境进行恢复。

语法

Generator函数

Generator函数以function *申明开头,并在需要暂停运行的地方添加yield关键字

function* myGenerator(){    // A    yield 'foo'    // B}

执行上面的myGenerator方法会创建一个Generator对象,我们可以通过next方法来控制函数执行。运行next方法会执行myGenerator函数中的代码,直到碰到下一个yield表达式(执行完yield才暂停),此时yield后的表达式的值就被返回出去了,而且myGenerator的执行就暂停了,当我们再次运行next方法时,myGenerator会在上次暂停的地方接着向下运行。

const g = myGenerator()const state01 = g.next() // {value: 'foo', done: false}const state02 = g.next() // {value: undefined, done: true}

yield

yield是伴随着Generator函数出现的,它允许我们返回多个值(多个状态)。然而我们只能在Generator中才能使用它。如果我们尝试在回调函数中用yield一个值,即使在Generator函数内部声明的,也会抛出错误

yield*

yield*是用来在一个Generator函数内部调用另一个Generator函数的

function* foo(){    yield 'foo'}function* bar(){    yield 'bar'    yield* foo()    yield 'bar again'}const b = bar()b.next() // {value: 'bar', done: false}b.next() // {value: 'foo', done: false}b.next() // {value: 'bar again', done: false}b.next() // {value: undefined, done: true}

遍历

由于Generator方法会返回一个遍历器对象(可遍历对象),因此我们可以使用一个遍历方法,例如for-of遍历该对象内部的所有状态(值)

  • for-of遍历

// 接上一个的例子for (let e of bar()) {    console.log(e)}/* 依次输出barfoobar again*/注意,b对应的遍历器对象已经遍历完毕,因此下面的例子只会输出undefinedfor (let e of b) {    console.log(e)}// undefined
  • 解构运算实现遍历

console.log([...bar()]) // ['bar', 'foo', 'bar again']

return

我们可以在Generator函数中增加return语句

function* myGenerator(){    yield 'foo'    yield 'bar'    return 'done'}var g = myGenerator()g.next() // {value: 'foo', done: false}g.next() // {value: 'bar', done: false}g.next() // {value: 'done', done: true}g.next() // {value: undefined, done: true}

但是如果使用for-of或者解构运算来遍历遍历器对象,则return后面的值将被忽略

for(let e of myGenerator()) {    console.log(e)}// foo// barconsole.log([...myGenerator])// ['foo', 'bar']

参考资料

转载地址:http://zaxnx.baihongyu.com/

你可能感兴趣的文章
数据挖掘概念与技术笔记
查看>>
获取时间和日期
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
MySQL 5.6查看数据库的大小
查看>>
android addCategory()等说明
查看>>
django信号
查看>>
java基础之反射---重要
查看>>
tdd 和 make file,以及cygwin
查看>>
重装系统后,delphi7打开报错
查看>>
i++的原子性问题
查看>>
【吉光片羽】短信验证
查看>>
git diff 的用法
查看>>
你不知道的Virtual DOM(二):Virtual Dom的更新
查看>>
CentOS 6.5搭建ELK环境ElasticSearch+Kibana+Logstash
查看>>
前端性能优化小结
查看>>
ubuntu中安装oracle 11g
查看>>
MacBook如何用Parallels Desktop安装windows7/8
查看>>
gitlab 完整部署实例
查看>>
GNS关于IPS&ASA&PIX&Junos的配置
查看>>
七天学会ASP.NET MVC (四)——用户授权认证问题
查看>>