石川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-认识生成器函数相关推荐

  1. 石川es6课程---3、变量let和常量const

    石川es6课程---3.变量let和常量const 一.总结 一句话总结: let非常好用,尤其是let的块级作用域可以解决之前要(function(){})()立刻执行函数做的块级作用域 1.js中 ...

  2. 石川es6课程---1-2、ES6简介

    石川es6课程---1-2.ES6简介 一.总结 一句话总结: 从ECMAScript的历史发展来看,太顺了的时候总会遇到一挫折,比如ecma4 1.ECMAScript 和 JavaScript关系 ...

  3. 石川es6课程---18、ES6 复习

    石川es6课程---18.ES6 复习 一.总结 一句话总结: 无论在讲课和学习中,复习总结都是很重要 二.ES6 复习 变量 let const 声明方式 能否重复声明 作用域 类型 是否支持变量提 ...

  4. 石川es6课程---17、ES7 预览

    石川es6课程---17.ES7 预览 一.总结 一句话总结: 人的价值恒定规律:无论得意还是迷茫之时,你的价值都不靠外界的评判或者你内心的悲喜而决定.而是当时的恒定的.能够提升他只能靠你提升自己的能 ...

  5. 石川es6课程---7、数组

    石川es6课程---7.数组 一.总结 一句话总结: ^ 主要就map(映射:一个对一个),reduce(汇总:一堆出来一个),filter  过滤器,forEach 循环(迭代) 四个方法 ^ 使用 ...

  6. 石川es6课程---4、箭头函数

    石川es6课程---4.箭头函数 一.总结 一句话总结: 相当于函数的简写,类似python lambda 函数,先了解即可 let show1 = function () {console.log( ...

  7. 石川es6课程---12、Promise

    石川es6课程---12.Promise 一.总结 一句话总结: 用同步的方式来书写异步代码,让异步书写变的特别简单 用同步的方式来书写异步代码 Promise 让异步操作写起来,像在写同步操作的流程 ...

  8. 石川es6课程---11、json

    石川es6课程---11.json 一.总结 一句话总结: ` 感觉更方便了一点,增加了一些简写 ` key-value 一样时可以简写:console.log({ a,b}}) ` 里面函数可以简写 ...

  9. 石川es6课程---9、面向对象-基础

    石川es6课程---9.面向对象-基础 一.总结 一句话总结: js老版本的面向对象和继承都不是很方便,新版的面向对象向其它语言靠拢,有了class,extends,constructor等关键字,用 ...

最新文章

  1. 中国700万程序员不够用怎么办?我们去问了北大谢涛,顶会ASE最有影响力论文奖首批华人得主...
  2. Java中Comparable和Comparator区别小结
  3. matlab r2012a win10,vs2010和Matlab R2012a 混合编程
  4. 入门训练 序列求和 c语言
  5. 详解html结构之间的各个关系,层级关系(以列表为例)
  6. 外卖行业现状分析_我国外卖行业发展现状与趋势一览
  7. Java 蓝桥杯 判断闰年
  8. defaultdict python_理解 Python 语言中的 defaultdict
  9. 重启打印机服务bat命令
  10. [原创]桓泽学音频编解码(14):AC3 时频转换模块算法分析
  11. 【Web渗透】信息收集篇——Google搜索引擎(二)
  12. 如何安全存储密码都不知道,难怪我被面试官吊打呢...学完这个一定打回去!...
  13. 我认知的 DevOps 核心价值
  14. 你应该掌握的JavaScript高阶技能(六)
  15. MPI实现求解10的八次方内素数的个数(版本一)
  16. 凡拓数字通过注册:年营收7亿 伍穗颖夫妇控制43%股权
  17. 电脑使用技巧提升篇9:使用360压缩软件文件加密
  18. 利用思维导图,快速整理小学语文复习重点,建议为孩子收藏!
  19. 分布式系统架构与分布式事务十问十答,小伙伴们赶快收藏吧
  20. CTP的交易指令类型

热门文章

  1. 实现ARM——Linux的自动登录
  2. Directory lookup for the file xxx.mdf failed with the operating system error 2
  3. UITableView使用指南
  4. SSO单点登录三种情况的实现方式详解
  5. 人脸识别,人脸关键点检测算法
  6. Android混淆解析
  7. 深拷贝与浅拷贝、空类与空数组
  8. 2018年1月29日
  9. Nancy之结合tinyfox给我们的应用提供简单的数据服务
  10. hadoop 1.2.1 安装步骤 伪分布式