Hi Generator
在接触到生成器之初对generator.next()和yield之间的关系是什么没有办法理解透彻,直到看到两句话:
- Generator 函数是一个状态机,封装了多个内部状态 — Generator 函数的语法
- 子程序(函数)就是协程的一种特例 — 协程
Generator 函数是一个状态机,封装了多个内部状态
function* helloworld() {yield 'hello'yield 'world'
}const ge = helloworld()
ge.next()
ge.next()
Generator helloworld中通过两个yield产出了两个状态,分别是’hello’和’world’,Generator外部获取这两个状态的方式是调用ge对象的next()方法。
第一次调用next方法获取第一个状态"hello"
,第二次调用next方法获取第二个状态"world"
。
其中yield
表达式和next
方法均用来切换执行上下文,其中next方法将执行上下文从Generator函数外部切换到内部,而yield将执行上下文从Generator函数内部切换到函数外部。除了切换上下文next还将入参传入了函数内部作为yield表达式的返回值,同理,yield也将表达式的值传递给了函数外部。所以,yield是另一种形式的return,而next方法是另一种形式的函数调用。
function* helloworld() {const a = yield 1console.log(a)yield 3
}const ge = helloworld()
const val1 = ge.next()
console.log(val1.value)
const val3 = ge.next(2)
console.log(val3.value)// 打印顺序是1 2 3
子程序(函数)就是协程的一种特例
function* helloworld() {const a = yield 1console.log(a)yield 3
}const ge = helloworld()
const val1 = ge.next()
console.log(val1.value)
const val3 = ge.next(2)
console.log(val3.value)// 打印顺序是1 2 3
在例子里可以将next()可以当做在执行函数,而yield作为return来看的就会好理解很多。
- 第一个
next()
从函数第一行开始执行,到yield 1
结束执行,返回值1到函数外部。 - 第二个
next(2)
,从第一个yield 1
处开始执行,用2
作为yield 1
的返回值,换句话说就是函数开始执行的入参,入参被const a
接收,到yield 3
返回值3
。
所以说子程序(函数)就是协程的一种特例。
函数也是封装了状态,通过调用函数获取对应状态,只是这个状态只有一个,函数只能被执行一次,retrun之后无法再继续return之后的语句执行,而generator提供了继续执行中断上下文的能力也就是调用next()方法。
Hi Generator相关推荐
- Python错误:AttributeError: 'generator' object has no attribute 'next'解决办法
今天在学习生成器对象(generation object)运行以下代码时,遇到了一个错误: #定义生成器函数 def liebiao(): for x in range(10): yield x #函 ...
- 3d stroke插件下载_推荐一款好用的PS 3D地图插件,PS插件3D Map Generator ,一键生成地图神器...
今天,给大家推荐一个强大的Photoshop(PS)地图插件--3D Map Generator,可以方便制作3D特效效果. 3D Map Generator插件是什么 3D Map Generato ...
- 利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator
一.前言 利用FPGA设计算法一直以来都是热点,同样也是难点.将复杂的数学公式 模型通过硬件系统来搭建,在低延时 高并行性等优势背后极大提高了设计难度和开发周期.Xilinx公司的sysGen(sys ...
- Jfinal Generator 不需要生成带某个前缀的表名数组的方法
2019独角兽企业重金招聘Python工程师标准>>> package com.demo.common.model; import javax.sql.DataSource; imp ...
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
阅读目录 1.复杂的JSON啥样子? 2.使用JSON C# Class Generator介绍和使用 3.就这么完了?No,没那么简单 4.资源 去年,我在一篇文章用原始方法解析复杂字符串,json ...
- Parser Generator Tips翻译(中英对译) by Joshua Xu
You can use the ParserWizard command from the Project menu to help you create initial YACC and Lex s ...
- ICPC 2005 hangzhou Generator (UVA1358)KMP + 期望DP / 高斯消元
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Generator Weblink https://www.luogu.com.cn/problem/ ...
- Loadrunner连接负载机失败,提示Failed to connect to the load generator.Check the output window for more detail
在测试连接负载机时,为何连接不上呢,提示"Failed to connect to the load generator.Check the output window for more d ...
- JavaScript 异步编程--Generator函数、async、await
JavaScript 异步编程–Generator函数 Generator(生成器)是ES6标准引入的新的数据类型,其最大的特点就是可以交出函数的执行的控制权,即:通过yield关键字标明需要暂停的语 ...
- JS中的 generator
JS 中的 generator (生成器)和 Python 中的很相似. 一个generator看上去像一个函数,但可以返回多次.与函数不同的是,generator由function*定义(注 ...
最新文章
- 百度谷歌等联合推出机器学习基准 加速AI软硬件发展
- python 内置模块 增加_模块的内置方法--Python提高班
- python 条形图_Python数据可视化:基于matplotlib绘制「堆积条形图」
- 2d游戏引擎_游戏60秒:RTS游戏从2D到3D的蜕变
- aix服务器屏幕显示被锁住了,AIX恢复密码过程总结
- ubuntu下配置jdk(离线压缩包方式)
- 7.企业安全建设入门(基于开源软件打造企业网络安全) --- 蜜罐与攻击欺骗
- itext html 转换pdf后 字体加粗,HTML转PDF字体的坑搞了半天
- CAXA图文档2007服务器端,CAXA图文档客户端系统管理员操作.doc
- 装双系统win10和android,教你安装Win10和安卓Android双系统(不是模拟器)
- 学习笔记4--自动驾驶汽车感知系统
- 领英给好友群发消息的方法和细节
- 怎么用浏览器访问计算机文件共享,如何用ES文件浏览器完全共享电脑里的文件流程...
- 青玉案·元夕 【宋代】辛弃疾
- spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题
- 计算机上根号是哪一个,电脑上怎么哪个键是数学中的开根号啊
- Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】
- ambari mysql 密码_ambari密码重置
- 仓库搬仓实施过程参考
- html引用阿里云矢量图标(不照搬官方,手把手教学)
热门文章
- Element UI主题换肤功能(基于vue-element-admin框架)
- find排除文件 linux_Linux find命令排除某个路径
- 趣味编程算法类文章征集列表
- 2D卷积与3D卷积的区别
- 当下电商究竟都适合从事那些项目,如何居家赚钱?
- 关于iptables封禁国外IP方法
- H3C_交换机_Vlan配置
- java cleartype_等宽雅黑宋体2.1(支持ClearType和GDI++)
- 复旦女博士于娟:为啥是我得癌症?
- 程序员在国企是种什么体验,国企好还是互联网企业好!