es6 新增了Generator函数,一种异步编程的解决方案

    回顾一下,es6 提供了新的遍历方法,for of ,适用于各种数据集合,统一了遍历操作,原生支持for of 集合的数据集合有。数组,字符串

  一部分的类数组,map,set。而对象是不适合与 for of 遍历的,因为原生没有实现Iterator接口,而手动的为对象添加Iterator接口,我们之前使用

  return next() 操作,而今天我们尝试用Generator 函数去实现对像的Iterator接口,

// Generator 函数实现对象的 Iterator接口
// 定义一个简单的对象
let obj = {
a: '12344444',
b: '333444',
c: 'dddddd',
d: 'meiy'
}
// 在 for of 学习中我们知道,要想使用for of 遍历 我们需要给对象实现Symbol.iterator接口
// Generator 函数的定义是function* ,每次调用Generator.next() 会执行函数内部的yeild
obj[Symbol.iterator] = function* () {
let keys =Object.keys(this) // Object.keys 得到的对象属性集合可以直接使用for of
for(let key of keys) {
yield [key,this[key]]
}
}
// 上面对象的Iterator接口已经定义完成下面我们使用for of 循环遍历
for(let item of obj) {
console.log(item)
}
// 结果

[ 'a', '12344444' ]
[ 'b', '333444' ]
[ 'c', 'dddddd' ]
[ 'd', 'meiy' ]

 

    定义后Genertation函数后,我们可以像调用普通函数一样,使用()去调用,但是Generator函数直接调用是不会执行的,我们必须掉用 

  Generator函数next()使其执行,执行到第一个yeild ,放回一个对象{value:'',done:false} ,如果对象已经执行完,则返回{value:'',done:true},如果还继续

  掉用next()方法则返回{value:undefined,done:true},Generator 除了next()外,还有两个操作,分别是throw(),return();(注,yeild 只能用于Generator内部)

  

// Generator 函数 next() return() throw()
// 让我们先定义一个简单的Generator函数
function* gen() {
console.log('开始了')
yield 1
yield 2
yield 3
return 4
}
// 当我们使用()去掉用时gen函数数,并不执行
let g = gen() // 不会输出开始了 注,Generator 不能使用new 去实例,会报错
console.log(g.next()) // 输出 开始了 { value: 1, done: false } 执行到第一个yeild处
console.log(g.next()) //{ value: 2, done: false }
console.log(g.next()) //{ value: 3, done: false }
console.log(g.next()) //{ value: 4, done: true } //执行完 则done 放回ture
// 如果没有最后一个return ,放回值就是undefined //next() 函数可以传入一个参数,作为上一个yeild 的返回值
function* fhz (x) {
let y = yield x +1
let z = yield y + 12
return y+z
}
let zx = fhz(5);
console.log(zx.next()) // 执行第一个 yeild 表达式,返回6 // 执行第二个yeild 表达式,第一个yeild并未传值进去,则y时undefined
//console.log(zx.next()) // undefined+12 =>> Nan
console.log(zx.next(2)) // 14
console.log(zx.next(1)) // 3
// 上一步执行完,y = 2 这一步,传入的是1 未yeild y+12的值,也是z的值,所有最终输出3

  Generation throw()方法

// Generator throw()
function* throws() {
try {
yield 2
} catch (ex) {
console.log('th'+ex)
}
}
let th = throws();
th.next() //只有调用了next Generator 内部才能执行
th.throw() //thundefined try {
th.throw('我该') // 内部已经没有catch 则访问外部的catch
} catch (err) {
console.log('12',err)
} function* jdd() {
throw new Error('不多不少')
yield 33; //前面抛出了 throw 这里就不会再执行了
}
let sj = jdd()
try {
sj.next()
} catch (err) {
console.log(err)
}
try {
console.log(sj.next())
} catch (err) {
console.log(err)
}

  Generation  return 函数

// Generator return()
function* fn () {
yield 1
yield 2
yield 3
yield 4
return 67
}
let f = fn()
console.log(f.return()) // { value: undefined, done: true } 因为未传入参数,返回的就是undefined
console.log(f.return(123)) // { value: 123, done: true } rerutn 后函数就不执行了
// 但如果函数内部有try finally 则直接会跳转到执行finally 内部 function* finna () {
try {
yield 1
yield 2
yield 3
}
finally {
yield 4
yield 5
}
return 6
}
let fina = finna()
console.log(fina.next()) //{ value: 1, done: false }
console.log(fina.return()) // 使用return,执行 执行yeild 4
console.log(fina.next()) //执行yeild 5
console.log(fina.next()) //执行,fina.return()
console.log(fina.next()) //{ value: undefined, done: true }

es6 generator函数的更多相关文章

  1. es6 generator函数的异步编程

    es6 generator函数,我们都知道asycn和await是generator函数的语法糖,那么genertaor怎么样才能实现asycn和await的功能呢? 1.thunk函数    将函数 ...

  2. ES6:Generator函数(1)

    Generator函数是ES6提供的一种异步编程解决方案.它会返回一个遍历器对象 function* helloWorldGenerator(){ yield “hello”; yield “worl ...

  3. es6 --- Generator 函数

    第一部分,ES6 中的 Generator 在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,但是 ES6 的Generator却给异步操作又提供了新的思路, ...

  4. ES6 - Note7:Generator函数

    Generator函数 1.Generator函数是ES6增加的异步编程解决方案之一,与普通的函数行为完全不同,类似于一个状态机,内部封装了多个状态. 在函数定义的形式上,跟普通函数差不多,有两处不同 ...

  5. ES6入门之Generator函数

    Generator Generator函数是ES6提供的一种异步编程解决方案,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历器对象,也就是说,Gen ...

  6. 转: ES6异步编程:Generator 函数的含义与用法

    转: ES6异步编程:Generator 函数的含义与用法 异步编程对 JavaScript 语言太重要.JavaScript 只有一根线程,如果没有异步编程,根本没法用,非卡死不可. 以前,异步编程 ...

  7. ES6的generator函数

    generator是什么? generator是ES6提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态.执行generator,会生成返回一个遍历器对象.返回的遍历器 ...

  8. ES6生成器函数generator

    ES6生成器函数generator generator是ES6新增的一个特殊函数,通过 function* 声明,函数体内通过 yield 来指明函数的暂停点,该函数返回一个迭代器,并且函数执行到 y ...

  9. ES6必知必会 (七)—— Generator 函数

    Generator 函数 1.Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同,通常有两个特征: function关键字与函数名之间有一个星号: 函数体内部使 ...

随机推荐

  1. ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

    一.前言 在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core ...

  2. KnockoutJS-与服务端交互

    几乎所有Web应用程序都要和服务器端交换数据,交换数据时最方便的就是使用JSON格式.Knockout可以实现很复杂的客户端交互,对于前后端交互使用的技术最为基本且常用的是Ajax,本次利用Ajax和 ...

  3. 轻量级.Net Core服务注册工具CodeDi发布啦

    为什么做这么一个工具 因为我们的系统往往时面向接口编程的,所以在开发Asp .net core项目的时候,一定会有大量大接口及其对应的实现要在ConfigureService注册到ServiceCol ...

  4. 微服务(入门一):netcore安装部署consul

    环境准备  vs开发环境:vs2017 consul版本: 1.4.4 netcore版本:2.1 安裝Consul  1.从官网下载consul到本地,选择系统对应的版本进行下载到本地,下载地址:h ...

  5. C# 将object对象转换为实体对象

    C# 将object对象转换为实体对象.一共两种方法. 第一种方法,代码如下: /// <summary> /// 将object对象转换为实体对象 /// </summary> ...

  6. SpringBoot启动原理分析

    用了差不多两年的SpringBoot了,可以说对SpringBoot已经很熟了,但是仔细一想SpringBoot的启动流程,还是让自己有点懵逼,不得不说是自己工作和学习的失误,所以以此文对Spring ...

  7. mysql 服务【安装】【启动】【停止】【卸载】【重置密码】

    windows安装:一.一机安装多个服务时,重复步骤,修改服务名即可: 1.mysqld install mysql_12336 --defaults-file="MYSQL_HOME\my ...

  8. ASP.NET Core 快速入门(环境篇)

    [申明]:本人.NET Core小白.Linux小白.MySql小白.nginx小白.而今天要说是让你精通Linux ... 的开机与关机.nginx安装与部署.Core的Hello World .. ...

  9. 如何使用Android Studio在安卓平台对Unity开发的应用进行性能检查?

    0x00 前言 大家常常会抱怨安卓平台没有一个统一.好用的性能检查工具.不能像iOS的instrument那样方便. 图片来自:Instruments Help 比如,Unity Blog在3年前就已 ...

  10. 百度地图点击地图显示地址详情的默认方法怎么关闭,去掉百度地图api图标信息

    去掉百度地图api图标信息 调用百度地图API时,如果想去掉百度的logo,只需要在css里设置: <style> .anchorBL{display:none} </style&g ...