Generator

一、Generator概述

1、Generator函数是一个普通函数,但是有以下几个特征:

  • function关键字与函数名之间有一个星号  //一般星号紧挨function关键字
  • 函数体内部使用yield语句,定义不同的内部状态  //使用实例的next()方法可依次取得不同的状态
  • 返回值是‘遍历器对象‘
  • 返回值是本身Generator函数的一个实例
  • 每一次调用都会产生新的‘遍历器对象‘
  • 无论何种遍历方式  都只能遍历一次  //for...of||next()||...运算符      //只能被遍历一次

2、yield语句  

  • 遇到yield语句,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值
  • 下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句
  • 如果没有再遇到新的yield语句,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值
  • 如果该函数没有return语句,则返回的对象的value属性值为undefined
  • yield语句不能用在普通函数中,否则会报错
  • yield语句如果用在一个表达式之中,必须放在圆括号里面
  • yield语句后面如果是一个函数,只用非匿名函数才会执行函数,否则只返回Function对象  //如下图:

3、与Iterator接口的关系

  • Generator函数就是遍历器生成函数,因此可以把Generator赋值给对象的Symbol.iterator属性,从而使得该对象具有Iterator接口
  • Generator函数执行后,返回一个遍历器对象。该对象本身也具有Symbol.iterator属性,执行后返回自身

4、测试如下:      

     

二、next()方法的参数

1、next方法可以带一个参数,该参数就会被当作上一个yield语句的返回值。

2、Generator函数从暂停状态到恢复运行,它的上下文状态(context)是不变的。通过next方法的参数,就有办法在Generator函数开始运行之后,继续向函数体内部注入值。也就是说,可以在Generator函数运行的不同阶段,从外部向内部注入不同的值,从而调整函数行为。

三、for...of

1、for...of循环可以自动遍历Generator函数,且此时不再需要调用next方法。

四、Generator.prototype.throw()

1、Generator函数返回的遍历器对象,都有一个throw方法,可以在函数体外抛出错误,然后在Generator函数体内捕获

2、遍历器对象的throw方法和全局的throw命令

五、Generator.prototype.return()

1、Generator函数返回的遍历器对象,还有一个return方法,可以返回给定的值,并且终结遍历Generator函数

2、如果return方法调用时,不提供参数,则返回值的value属性为undefined

3、如果Generator函数内部有try...finally代码块,那么return方法会推迟到finally代码块执行完再执行。

六、yield*语句

1、用来在一个Generator函数里面执行另一个Generator函数  //将其展开成多个yield语句

2、yield*是for...of的一种简写形式,完全可以用后者替代前者

3、如果yield*后面跟着一个数组,由于数组原生支持遍历器,因此就会遍历数组成员  //字符串也一样

4、任何数据结构只要有Iterator接口,就可以被yield*遍历

5、yield*命令可以很方便地取出嵌套数组的所有成员。

function* iterTree(tree) {
  if (Array.isArray(tree)) {
    for(let i=0; i < tree.length; i++) {
      yield* iterTree(tree[i]);
    }
  } else {
    yield tree;
  }
}

const tree = [ ‘a‘, [‘b‘, ‘c‘], [‘d‘, ‘e‘] ];

for(let x of iterTree(tree)) {
  console.log(x);
}
// a
// b
// c
// d
// e

七、作为对象属性的Generator函数

八、Generator函数的this

1、Generator函数总是返回一个遍历器而不是this对象,ES6规定这个遍历器是Generator函数的实例,也继承了Generator函数的prototype对象上的方法。

2、Generator函数也能跟new命令一起用

  

3、可通过变通的方法访问generator函数的this对象  //依赖于原型对象,将this对象逐个添加到元原型对象

  

九、意义||作用

1、Generator与状态机

2、Generator与协程

十、应用

1、异步操作的同步化表达

2、控制流管理

3、部署iterator接口

4、作为数据结构

  

时间: 2024-10-23 23:56:31

Generator的相关文章

使用MyBatis Generator自动生成实体、mapper和dao层

通过MyBatis Generator可以自动生成实体.mapper和dao层,记录一下怎么用的. 主要步骤: 关于mybatis从数据库反向生成实体.DAO.mapper: 参考文章:http://www.cnblogs.com/wangkeai/p/6934683.html第一种方式:main方法运行(推荐) 1.在pom.xml中加入插件依赖: 2.写mbgConfiguration.xml文件,jdbc.properties文件 3.写/SSM/src/main/java/main/Ge

babel转码时generator的regeneratorRuntime

今天写generator函数时发现出错:regeneratorRuntime. 在stackoverflow网友说需是本地babel软件包没有安装完全. package.json: "devDependencies": { "babel-core": "^6.0.20", "babel-polyfill": "^6.0.16", "babel-preset-es2015": "

async(await)函数和 Generator 函数 区别

async 函数是 Generator 函数的语法糖. async 函数对 Generator 函数的改进体现在: 1. async 内置执行器. Generator 函数的执行必须靠执行器,需要调用 next() 方法,或者用co 模块:而 async 函数自带执行器.也就是说,async 函数的执行与普通函数一模一样,只要一行. 2. 更好的语义. async 和 await 比起星号和 yield,语义更清楚. 3.更广的适用性. co 模块约定,yield 命令后面只能是 Thunk 函

MyEclipse下安装MyBatis Generator代码反向生成工具

一.离线方式: 在http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/下载 features/ plugins/ 里面所有的jar包,新建一个mybatis-generator文件夹,把features跟plugins都丢到mybatis-generator文件夹中,把mybatis-generator文件夹移到D:\MyEclipse10_7\MyEclipse 10\dropins

Entity Framework工具POCO Code First Generator的使用

在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一款不错的工具 在Visual Studio中,通过"工具"→"扩展和更新..."来安装Entity Framework Reverse POCO Code First Generator 这里添加一个控制台项目,并在项目中添加POCO Code First Genera

Mybatis入门实例(三)——使用MyBatis Generator生成DAO(转载http://qiuqiu0034.iteye.com/blog/1163026)

接上回 http://qiuqiu0034.iteye.com/blog/1162952 虽然MyBatis很方便,但是想要手写全部的mapper还是很累人的,好在MyBatis官方推出了自动化工具,可以根据数据库和定义好的配置直接生成DAO层及以下的全部代码,非常方便. 需要注意的是,虽然自动化工具需要一个配置文件,但是MyBatis的配置文件仍然不能少,自动化工具的配置文件用于对生成的代码的选项进行配置,MyBatis的配置文件才是运行时的主要配置文件. 这个工具叫做MyBatis_Gene

ES6生成器函数generator

generator是ES6新增的一个特殊函数,通过 function* 声明,函数体内通过 yield 来指明函数的暂停点,该函数返回一个迭代器,并且函数执行到 yield语句前面暂停,之后通过调用返回的迭代器next()方法来执行yield语句.如下代码演示: function* generator() { yield 1; yield 2; yield 3; } var gen = generator(); 如上代码:generator函数的调用方法与普通函数一样,也是在函数名后面加上一对圆

Python 基础 - Day 4 Learning Note - Generator 生成器

列表生成器/列表解析 list comprehension 简单灵活地创建列表,通常和lambda(), map(), filter() 一起使用 通过列表生成式, 直接创建列表.但是,收到内容限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问几个元素,那其他的就白占空间.列表生成器能够一边循环一边计算,大大节省大量的空间.是生成器的一种. 只有调用,才能生成. 不支持切片操作,只能通过__next()___一个个取数字. 基本语法

mybatis generator工具的使用

mybatis反转数据库的配置文件: generatorConfig.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybati

JSON C# Class Generator ---由json字符串生成C#实体类的工具

json作为互联网上轻量便捷的数据传输格式,越来越受到重视.但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率.JSON C# Class Generator 能将json格式所表示的Javascript对象转化成强类型的C#实体类,来实现减少代码输入的效果. http://jsonclassgenerator.codeplex.com/  ----开源的winform工具. http://json2csharp.com/    同时推荐 另一款在线转化工具,大家看名字就知道了.