es6 generator函数
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函数的更多相关文章
- es6 generator函数的异步编程
es6 generator函数,我们都知道asycn和await是generator函数的语法糖,那么genertaor怎么样才能实现asycn和await的功能呢? 1.thunk函数 将函数 ...
- ES6:Generator函数(1)
Generator函数是ES6提供的一种异步编程解决方案.它会返回一个遍历器对象 function* helloWorldGenerator(){ yield “hello”; yield “worl ...
- es6 --- Generator 函数
第一部分,ES6 中的 Generator 在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,但是 ES6 的Generator却给异步操作又提供了新的思路, ...
- ES6 - Note7:Generator函数
Generator函数 1.Generator函数是ES6增加的异步编程解决方案之一,与普通的函数行为完全不同,类似于一个状态机,内部封装了多个状态. 在函数定义的形式上,跟普通函数差不多,有两处不同 ...
- ES6入门之Generator函数
Generator Generator函数是ES6提供的一种异步编程解决方案,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历器对象,也就是说,Gen ...
- 转: ES6异步编程:Generator 函数的含义与用法
转: ES6异步编程:Generator 函数的含义与用法 异步编程对 JavaScript 语言太重要.JavaScript 只有一根线程,如果没有异步编程,根本没法用,非卡死不可. 以前,异步编程 ...
- ES6的generator函数
generator是什么? generator是ES6提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态.执行generator,会生成返回一个遍历器对象.返回的遍历器 ...
- ES6生成器函数generator
ES6生成器函数generator generator是ES6新增的一个特殊函数,通过 function* 声明,函数体内通过 yield 来指明函数的暂停点,该函数返回一个迭代器,并且函数执行到 y ...
- ES6必知必会 (七)—— Generator 函数
Generator 函数 1.Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同,通常有两个特征: function关键字与函数名之间有一个星号: 函数体内部使 ...
随机推荐
- java游戏开发杂谈 - 画布和画笔
在Eclipse里,编写如下两个类: package game2; import java.awt.Color; import java.awt.Graphics; import javax.swin ...
- .NETCore 千星项目模块化开发框架 SimplCommerce 详解
SimplCommerce 是 github 上过千星的.netcore 商城示例项目,本文详解他的模块化框架现实思路,其业务(如产品.订单)不作介绍.因作者文笔水平很差,它又很值得学习和推荐,就算不 ...
- 《k8s-1.13版本源码分析》- 调度器设计
本文原始地址:https://farmer-hutao.github.io/k8s-source-code-analysis/core/scheduler/desigh.html github项目地址 ...
- Redis调用的流程(新手使用)
就用查省市为例,别人还没查就把所有都弄好,很浪费资源和时间,redis是为了存储常用的查询操作的[结果],以此来减少直接查询数据库的次数,以下内容仅供参考,请勿照抄.(如有说得不好之处,请指点.) 言 ...
- css3 之炫酷的loading效果
css3 之炫酷的loading效果 今天实现了一个炫酷的loading效果,基本全用css来实现,主要练习一下css3的熟练运用 js需要引入jquery 只用到了一点点js 先看效果图 html: ...
- sublime text3快速生成html时,tab键失效
sublime tab键失效
- 去除inline-block元素间的间距
一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或者空格隔开的情况下会有间距,这是因为浏览器在解析时,会将换行等读取成一个空格导致. 二.移出空格的方法 ① 我们可以去掉元 ...
- js生成[n,m]的随机数,js如何生成随机数,javascript随机数Math.random()
一.预备知识 Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ 1 ...
- mpvue小程序开发之 集成第三方UI框架Vant Weapp UI
集成进第三方的UI框架其实很简单 这里把vant-weapp的dist目录重命名为vant-weapp放在项目根目录的static文件夹下: 在src文件夹下,即我们写vue代码的位置,正在编写的页面 ...
- python-memcached学习笔记
介绍: memcached是免费.开源.高性能.分布式内存对象的缓存系统(键/值字典),旨在通过减轻数据库负载加快动态web应用程序的使用. 数据类型:只用一种字符串类型 1:安装 sudo apt- ...