当前位置:网站首页>es6新增-Generator(异步编程的解决方案2)
es6新增-Generator(异步编程的解决方案2)
2022-08-03 17:38:00 【卷心菜007】
目录
Generator生成器函数
一.使用和注意事项
1.定义(yield关键字只能出现在生成器函数中)
function* g(){
*:生成器函数的标识,在function关键字和函数名之间就可
yield “钱”
yield “多”
yield “多”
}
形式上,Generator函数是一个普通函数,但是有两个特征:
a.function关键字与函数名之间有一个星号*
b.函数体内部使用yiled表达式,定义不同的内部状态(yiled的意思是“产出”)
2.调用
生成器函数调用,不会立即执行函数体,
而是返回一个Iterator遍历器对象,调用next()方法则继续往后执行,碰到yield关键字就暂停
const genObj = g()
console.log(genObj)
console.log(genObj.next())
console.log(genObj.next())
console.log(genObj.next())
console.log(genObj.next())
3.遍历
for(let item of g()){
console.log(item) }
输出:钱 多
只输出一个“多“的原因:(只限在Genterator函数中,在其他函数中正常遍历)
for item of循环碰到done为true的地方就结束了,只输出done为false的部分
二.next()方法传参(好难*)
function * g(a){
const b = 2*(yield(a-1))
const c = yield(b/4)
return (a-b+c)
}
const o = g(2)
console.log(o.next()) //输出:{ value:1,done:false }
console.log(o.next(6)) //输出:{ value:3,done:false }
(yield(a-1)) = 6 则b = 12
console.log(o.next(3)) //输出:{ value:-7,done:true }
yield(b/4) = 3 则c = 3 先前赋值:a = 2,b = 12 则return = -7
const b = g(3)
console.log(b.next()) //输出:{ value:4,done:false }
console.log(b.next(0)) //输出:{ value:0,done:false }
(yield(a-1)) = 0 则b = 0
console.log(b.next(1)) //输出:{ value:4,done:true }
yield(b/4) = 1 则c = 1 先前赋值:a = 3,b = 0 则return = 4
三.yield*表达式
1.yield*表达式的使用
如果在Genderator函数内部,调用另一个Genderator函数。
需要在前面的Genderator的函数体内部,自己手动完成。
function * g1(){
yield "冰";
yield "墩";
yield "墩";
}
function * g2(){
yield "雪";
//手动遍历 g1()
for(let i of g1()){
console.log(i)
}
yield "容";
yield "融";
}
for(let v of g2()){
console.log(v)
}
输出:雪 冰 墩 墩 容 融
上面代码中,g1和g2都是Genderator函数,在g2里面调用g1,就需要手动遍历g1()。
如果有多个Genderator函数嵌套,写起来就非常麻烦。
es6提供了 yield*表达式作为解决办法。
用来在一个Genderator函数里面执行另一个Genderator函数。
function *g2(){
yiled "雪";
yiled* g1()
yield "容";
yield "融";
}
示例
function * f1(){
yiled "北京"
}
function * f2(){
yiled "hello"
yiled f1()
yiled "东奥"
}
const gen = f2()
console.log(gen.next().value) 输出:“hello”
console.log(gen.next().value) 输出:一个遍历器对象
console.log(gen.next().value) 输出:“东奥”
function * f3(){
yiled "hello"
yiled* f1()
yiled "东奥"
}
const gen = f3()
console.log(gen.next().value) 输出:“hello”
console.log(gen.next().value) 输出:“北京”
console.log(gen.next().value) 输出:“东奥”
四.应用
生成器函数的应用:
React中Redux-Saga(dva)中间件,就是生成器函数的典型应用场景
需求:每隔1s按照顺序输出1,2,3,4,5
for(let i = 1;i<=5;i++){
setTimeout(()=>{
console.log(1)
},1000)
}
输出:1s后同时输出1,2,3,4,5
改造:每隔1s按照顺序输出1,2,3,4,5
const delay = n =>new Promise(resolve =>{
setTimeout(()=>{
resolve(n)
},1000)
})
function * g(){
for(let i = 1;i<=5;i++){
const x = yield delay(i)
console.log(x)
}
}
function co(g){
const o = g()
next()
function next(a){
const {value,done} = o.next(a)
if(done) return
value.then(data=>{
next(data)
})
}
}
co(g)
边栏推荐
- 405. Convert a Number to Hexadecimal
- JVS低代码-多数据模型与数据联动配置举例
- 【Metaverse系列一】元宇宙的奥秘
- websocket Handshake failed due to invalid Upgrade header
- fastposter v2.9.0 程序员必备海报生成器
- 一键进入华为云会议,长期免费值得所有开发团队有一套【华为云至简致远】
- 什么是鉴权?一篇文章带你了解postman的多种方式
- 【数据库数据恢复】SqlServer数据库无法读取的数据恢复案例
- isNotBlank与isNotEmpty
- 中国算力大会昇腾鲲鹏生态论坛举办;快手成立独立to B业务部门…
猜你喜欢

yaml数据格式

Interpretation of the paper (JKnet) "Representation Learning on Graphs with Jumping Knowledge Networks"

目标检测-YOLOv3理论讲解

华为ECS云服务器上安装Docker及部署Redis详细教程【华为云至简致远】

ASP.NET Core依赖注入之旅:3.Service Locator和依赖注入

企业如何选择低代码开发平台

工程仪器设备在线监测管理系统常见问题和注意事项

cell delay和net delay

一键进入华为云会议,长期免费值得所有开发团队有一套【华为云至简致远】

【技术白皮书】第一章:OCR智能文字识别新发展——深度学习的文本信息抽取
随机推荐
【保姆级示例向】观察者模式
为什么我用了Redis之后,系统的性能却没有提升
CC2530_ZigBee+HUAWEI CLOUD IOT: Design your own cold chain acquisition system
ATM银行系统(对象初级练习)
JS 字符串转 GBK 编码超精简实现
【JS】利用JS给删除按钮添加提示框
JSON.stringify()的深入学习和理解
PMP试题 | 每日一练,快速提分
mysql命令
three.js简介
【mysql】SIGN(x) function
yaml数据格式
Digital IC Handwriting - MCMM, WNS and TNS
目标检测-YOLOv3理论讲解
一加Ace值得买吗?用实力诠释性能的强大
303. Range Sum Query - Immutable
九种方法!教你如何读取resources目录下的文件路径
“vite”和“vite预览”有什么区别?
11. Container With Most Water
mysql之的执行计划

