在Generator函数出现之前JS的函数只能返回一个值,返回的方式就是return,但是Generator函数可以返回多个值,返回的方式是yield。并且Generator赋予了外部动态影响函数内部的执行顺序的能力。

基础语法

function* f () {const a = yield 1console.log(a)const b = yield 2console.log(b)
}var ff = f()ff.next() // {done: false, value: 1}
ff.next(10) // {done: false, value: 2}
ff.next(20) // {done: true, value: undefined}

上面函数执行的时候,并没有开始执行函数体内的内容。当执行ff的next方法的时候开始执行函数体内容,直到yield为止。当遇到yield 则将yield后面的表达式计算出的结果返回到Generator函数外。执行next方法则再次从中断的地方(上次执行yield跳出函数的地方)进入到Generator函数内部执行,而next的参数就被当做yield表达式的计算结果。

有感

通过上面的描述可以看出是yield和next方法做的事情就是转让执行权,当执行遇到yield的时候会将结果返回到函数外,也就是将执行权交到了函数外面,那么什么时候再回来执行Generator内部代码就要看外部什么时候调用next方法。

一个简单让Generator函数自执行函数

function singleCo (ge) {var ff = ge()function next (val) {var res = ff.next(val) // 将执行权交到Generator内部if (res.done) {console.log('Generator函数执行完毕')} else {console.log(res.value)res.value(next) // 将改变执行权的权利交给了,yield出来的chunk函数()}}next()
}

上面的函数需要Generator内yield表达式返回的是一个特殊的函数,这个函数会接收一个函数做回调。

function* ge () {var a = yield function (cb) {cb(1)}console.log(a)var b = yield function (cb) {cb(2)}console.log(b)
}

开始执行

singleCo(ge) // 会自执行打印出 1 2

参考

Generator 函数的语法

Generator执行步骤浅析相关推荐

  1. 【计算机系统结构】~ MCU、AXI、IIC、SPI、GPIO、JTAG 接口、指令执行步骤、晶体与晶振的区别

    本章目录: 1. MCU 2. AXI 3. IIC 4. SPI 4.1 IIC.SPI.UART.CAN.RS485.USB.PCI速率比较 4.1.1 I2C 4.1.2 SPI 4.1.3 C ...

  2. mysql数据库SELECT语句执行步骤

    2019独角兽企业重金招聘Python工程师标准>>> (1) FROM <left_table> (3) <join_type> JOIN <righ ...

  3. jdk类加载器执行步骤_[JDK 11] jcmd中的类加载器层次结构详细信息

    jdk类加载器执行步骤 自从在JavaOne 2012上听说 jcmd以来,我就一直是命令行诊断工具jcmd的 粉丝 . 从那时起,我已经广泛使用了此工具,并多次在此博客中发布过此工具: jcmd:一 ...

  4. android自定义的生命周期,android 自定义控件之ViewGroup生命周期执行步骤(示例代码)...

    前言 了解ViewGroup的生命周期的执行步骤对于自己自定义ViewGroup的时候十分重要,清楚了整个流程才能对ViewGroup有更深的理解.本文从个人的总结,来阐述一下执行的顺序. 执行说明 ...

  5. stylegan-encoder代码执行步骤和解释

    目录 (一)从图片中抽取并对齐人脸: (二)找到对齐人脸图片的latent表达: (三)从对齐的人脸头像提取特征码并生成StyleGAN头像: (四)用别人的特征码修饰你的照片特征码,并生成混合后的S ...

  6. sql语句执行步骤详解

    一.准备工作 先来一段伪代码,首先你能看懂么? SELECT DISTINCT <select_list>FROM <left_table><join_type> ...

  7. DataQL之语法-万能查询执行步骤

    万能查询执行步骤 引用包 <dependency><groupId>net.hasor</groupId><artifactId>hasor-dataq ...

  8. Flutter进阶篇(4)-- Flutter的Future异步详解一、认识Future二、创建多个Future的执行步骤三、then函数嵌套使用的执行步骤四、综合示例五、我们来看看Future的源码

    https://cloud.tencent.com/developer/article/1375846 本文首发在公众号Flutter那些事,欢迎大家多多关注. 说明:本文中的所有函数的引用在main ...

  9. make的执行步骤以及常见的make命令,make distclean 以及和make clean的区别

    目录标题 前言 命令概述 make的执行步骤 make distclean 以及和make clean的区别 前言 代码变成可执行文件,叫做编译(compile):先编译这个,还是先编译那个(即编译的 ...

最新文章

  1. mysql索引的方法_mysql查看索引方法
  2. 二叉树链表结构表示法
  3. 初学ctypes:打开进程并返回相关信息
  4. Teamprise Readies Java SDK for TFS
  5. jQuery初识和常用事件(一)
  6. Log4j的使用说明
  7. 各种语言的模块导入导出形式
  8. Win7如何自定义鼠标右键菜单 添加新建文本文档
  9. angulrar知识点整理
  10. adb 命令 monkey命令
  11. mt管理器图片在哪个文件夹_MT管理器构造(新手小白教程)-小白文件管理器
  12. 跟大家分享一下牛人常用的资源(牛客网 )!
  13. 微信公众号卡券php开发,微信公众号实现会员卡领取功能
  14. 百度竞价常见问题:影响点击量的因素有哪些?
  15. 如何调试Hola Studio
  16. Chia命令行P图工具
  17. 维生素C(抗坏血酸)摄入过多有啥后果?
  18. linux ftok()
  19. 【线性代数及其应用】05 - 正交性和最小二乘
  20. 卡特兰数(n个节点的二叉树情况数量+hdu2067) (超级卡特兰数(施罗德数))

热门文章

  1. rust如何在木板上上传图片_通过编写一个简单的游戏来学习 Rust | Linux 中国
  2. python request 留位置4
  3. Linux中的15个‘echo’ 命令实例
  4. numpy的使用数组的创建2
  5. python多线程编程(3): 使用互斥锁同步线程
  6. cp: omitting directory解决方案
  7. javascript中构造函数的说明
  8. ios - Parse Issues in NSObjCRuntime, NSZone, and NSObject
  9. Netty writeAndFlush() 流程与异步
  10. java 7 update 17_Java version 7, Update 17 is NOT recongnized by FireFox version 19.0.2