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. MIP 组件库升级公告

    背景 为了方便广大开发者们更好地使用组件,现对 MIP 组件库统一进行升级,升级后将分为通用组件和自定义组件两类,方便开发. 通用组件,即考虑了组件通用性方便所有开发者参考使用的组件,将存放于 mip ...

  2. BF-9000 BMC任务关键型应急通信系统

    一.系统简介 BF-9000 BMC任务关键型应急通信系统,凝聚北峰通信近30年专网通信与应急通信研发的经验,并结合用户实际需求和应用场景所打造. 整体设计思路是采用骨干网.前指网.分队战斗网三层组网 ...

  3. React 虚拟 DOM 的差异检测机制

    React 使用虚拟 DOM 将计算好之后的更新发送到真实的 DOM 树上,减少了频繁操作真实 DOM 的时间消耗,但将成本转移到了 JavaScript 中,因为要计算新旧 DOM 树的差异嘛.所以 ...

  4. es6学习笔记-async函数

    1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...

  5. 解放程序员双手之Supervisor

      前言 对于大部分程序员来说,主要工作都是进行编码以及一些简单的中间件安装,这就导致了很多人对于“运维”相关的工作会比较生疏.例如当我们拥有一台自己的服务器以后,可能会在上面跑一跑自己blog程序, ...

  6. AES加密然后ajax传输数据

    最近做的一个项目,需要对传输的参数进行aes加密,所以就顺便的了解了一下,因为这种东西,肯定都是有写好的,现成的,所有这里就简单的记录一下,方便以后自己和大家查找. 首先附上百度的关于AES的百度百科 ...

  7. 联发科MT8788基带处理器介绍

    MT8788设备具有集成的蓝牙.fm.wlan和gps模块,是一个高度集成的基带平台,包括调制解调器和应用处理子系统,启用LTE/LTE-A和C2K智能设备应用程序.该芯片集成了工作在2.0GHz的A ...

  8. VirtualAPK的简单使用

    VirtualApk引入步骤: 一.宿主应用引入VirtualApk 1.在项目的build.gradle文件中加入依赖: dependencies { classpath 'com.didi.vir ...

  9. Django-CSRF跨站请求伪造防护

    前言 CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为“One Click Attack”或者Session Riding,通常缩写为C ...

  10. Cesium3DTileset示例

    3D Tiles是Cesium中很核心的一部分,尤其是用来实现大范围的模型场景数据的加载应用. 三维倾斜模型.人工建模.BIM模型等等,都可以转换成3D Tiles,进而为我们所用. 从Cesium1 ...