石川es6课程---13-16、generator-认识生成器函数
石川es6课程---13-16、generator-认识生成器函数
一、总结
一句话总结:
` generator函数,中间可以停,到哪停呢,用 yield 配合,交出执行权
` 需要调用next()方法启动执行,需要遇到 yield 停, 踹一脚走一步
` generator函数前面加一个 * 两边可以有空格,或靠近函数或function:function *show2() {
` 背后实际生成多个小函数,实现走走停停
function show() {console.log('a')console.log('b') } show() // 普通函数function *show2() {console.log('1')yieldconsole.log('2') } let genObj = show2() genObj.next() // 1 genObj.next() // 2 genObj.next() // 最后了,没有结果
1、generator-yield是啥?
- yield既可传参,又可以返回
- 第一个next()传参无效,只用来启动
- 如果函数前漏掉 *,就是普通函数,如果有yield会报错, ReferenceError: yield is not defined
function * show() {console.log('1')var a = yieldconsole.log('2')console.log(a) } // yield 传参 var gen = show() gen.next() // 1 gen.next() // 2 和 undefined 因为没有传参,yield没有返回值 var gen = show() gen.next(10) // 1 第一次执行到yield,但没有执行赋值 gen.next(20) // 2 和 20function* show2() {console.log('1')yield 10console.log('2') } // yield 返回 var gen = show2() var res1 = gen.next() console.log(res1) // { value: 10, done: false } var res2 = gen.next() console.log(res2) // { value: undefined, done: true } 最后的value需要return返回
2、generator-实例?
Promise 适合一次读一组,generator 适合逻辑性的
// 带逻辑-generator runner(function * () {let userData = yield $.ajax({url: 'getUserData'})if (userData.type == 'VIP') {let items = yield $.ajax({url: 'getVIPItems'})} else {let items = yield $.ajax({url: 'getItems'})} }) // yield 实例,用同步方式写异步 server.use(function * () {let data = yield db.query(`select * from user_table`)this.body = data })
二、generator-认识生成器函数
1.generator-认识生成器函数
- generator 生成器函数
- 普通函数,一路到底
- generator函数,中间可以停,到哪停呢,用 yield 配合,交出执行权
- yield 有 放弃、退让、退位的意思
- 需要调用next()方法启动执行,需要遇到 yield 停, 踹一脚走一步
- generator函数前面加一个
*
两边可以有空格,或靠近函数或function
- 背后实际生成多个小函数,实现走走停停
function show() {console.log('a')console.log('b')
}
show() // 普通函数function *show2() {console.log('1')yieldconsole.log('2')
}
let genObj = show2()
genObj.next() // 1
genObj.next() // 2
genObj.next() // 最后了,没有结果
2.generator-yield是啥
yield
- 既可传参,又可以返回
- 第一个
next()
传参无效,只用来启动
如果函数前漏掉
*
- 就是普通函数
- 如果有
yield
会报错,ReferenceError: yield is not defined
- yield 只能在Generator函数内部使用
function * show() {console.log('1')var a = yieldconsole.log('2')console.log(a)
}
// yield 传参
var gen = show()
gen.next() // 1
gen.next() // 2 和 undefined 因为没有传参,yield没有返回值
var gen = show()
gen.next(10) // 1 第一次执行到yield,但没有执行赋值
gen.next(20) // 2 和 20function* show2() {console.log('1')yield 10console.log('2')
}
// yield 返回
var gen = show2()
var res1 = gen.next()
console.log(res1) // { value: 10, done: false }
var res2 = gen.next()
console.log(res2)
// { value: undefined, done: true } 最后的value需要return返回
3.generator-实例
- Promise 适合一次读一组
- generator 适合逻辑性的
// 带逻辑-generator
runner(function * () {let userData = yield $.ajax({url: 'getUserData'})if (userData.type == 'VIP') {let items = yield $.ajax({url: 'getVIPItems'})} else {let items = yield $.ajax({url: 'getItems'})}
})
// yield 实例,用同步方式写异步
server.use(function * () {let data = yield db.query(`select * from user_table`)this.body = data
})
三、generator 生成器,函数
generator 生成器,函数
- 普通函数
- 一路到底
- generator函数
- 中间能暂停
- 使用场景
- 请求数据
function 函数(){//codeajax(xx,function(){//code回调方式})//code } function *函数(){//codeyield ajax(xxx)//yield将整个生成函数分割成若干个普通小函数,通过next()依次执行函数//code }
yield
- 传参
function *show(){alert(1)let a=yieldalert(2)}let gen=show()//如果第一个next想要传参的话直接同正常函数一样function *show(num1,num2){alert(`${num1},${num2}`)alert(1)let a=yieldalert(2)}let gen=show()let gen=show(99,88)gen.next(12)//第一个next没法给yield传参gen.next(5)
- 返回
function *show(){alert('a')yield 12alert('b')}let gen=show()res1=gen.next()console.log(res1)//{value:12,done:false}res2=gen.next()console.log(res2)//{value:undefined(取决于函数体中的return值),done:true}
转载于:https://www.cnblogs.com/Renyi-Fan/p/11617776.html
石川es6课程---13-16、generator-认识生成器函数相关推荐
- 石川es6课程---3、变量let和常量const
石川es6课程---3.变量let和常量const 一.总结 一句话总结: let非常好用,尤其是let的块级作用域可以解决之前要(function(){})()立刻执行函数做的块级作用域 1.js中 ...
- 石川es6课程---1-2、ES6简介
石川es6课程---1-2.ES6简介 一.总结 一句话总结: 从ECMAScript的历史发展来看,太顺了的时候总会遇到一挫折,比如ecma4 1.ECMAScript 和 JavaScript关系 ...
- 石川es6课程---18、ES6 复习
石川es6课程---18.ES6 复习 一.总结 一句话总结: 无论在讲课和学习中,复习总结都是很重要 二.ES6 复习 变量 let const 声明方式 能否重复声明 作用域 类型 是否支持变量提 ...
- 石川es6课程---17、ES7 预览
石川es6课程---17.ES7 预览 一.总结 一句话总结: 人的价值恒定规律:无论得意还是迷茫之时,你的价值都不靠外界的评判或者你内心的悲喜而决定.而是当时的恒定的.能够提升他只能靠你提升自己的能 ...
- 石川es6课程---7、数组
石川es6课程---7.数组 一.总结 一句话总结: ^ 主要就map(映射:一个对一个),reduce(汇总:一堆出来一个),filter 过滤器,forEach 循环(迭代) 四个方法 ^ 使用 ...
- 石川es6课程---4、箭头函数
石川es6课程---4.箭头函数 一.总结 一句话总结: 相当于函数的简写,类似python lambda 函数,先了解即可 let show1 = function () {console.log( ...
- 石川es6课程---12、Promise
石川es6课程---12.Promise 一.总结 一句话总结: 用同步的方式来书写异步代码,让异步书写变的特别简单 用同步的方式来书写异步代码 Promise 让异步操作写起来,像在写同步操作的流程 ...
- 石川es6课程---11、json
石川es6课程---11.json 一.总结 一句话总结: ` 感觉更方便了一点,增加了一些简写 ` key-value 一样时可以简写:console.log({ a,b}}) ` 里面函数可以简写 ...
- 石川es6课程---9、面向对象-基础
石川es6课程---9.面向对象-基础 一.总结 一句话总结: js老版本的面向对象和继承都不是很方便,新版的面向对象向其它语言靠拢,有了class,extends,constructor等关键字,用 ...
最新文章
- 中国700万程序员不够用怎么办?我们去问了北大谢涛,顶会ASE最有影响力论文奖首批华人得主...
- Java中Comparable和Comparator区别小结
- matlab r2012a win10,vs2010和Matlab R2012a 混合编程
- 入门训练 序列求和 c语言
- 详解html结构之间的各个关系,层级关系(以列表为例)
- 外卖行业现状分析_我国外卖行业发展现状与趋势一览
- Java 蓝桥杯 判断闰年
- defaultdict python_理解 Python 语言中的 defaultdict
- 重启打印机服务bat命令
- [原创]桓泽学音频编解码(14):AC3 时频转换模块算法分析
- 【Web渗透】信息收集篇——Google搜索引擎(二)
- 如何安全存储密码都不知道,难怪我被面试官吊打呢...学完这个一定打回去!...
- 我认知的 DevOps 核心价值
- 你应该掌握的JavaScript高阶技能(六)
- MPI实现求解10的八次方内素数的个数(版本一)
- 凡拓数字通过注册:年营收7亿 伍穗颖夫妇控制43%股权
- 电脑使用技巧提升篇9:使用360压缩软件文件加密
- 利用思维导图,快速整理小学语文复习重点,建议为孩子收藏!
- 分布式系统架构与分布式事务十问十答,小伙伴们赶快收藏吧
- CTP的交易指令类型