对ES6的yield示例分析
近期ES6标准如火如荼的发展,其中主要还是各大浏览器的支持,最重要厂商支付宝,微信的支持,使得国内的发展也很迅猛。
这里主要是对yield关键字的,yield实际上可以看作是一种新的中断机制,大家都知道javascript函数执行是顺序的,中途没有暂停,等待消息只能通过回调或者settimeout等延迟检查来完成。
有些示例说yield和线程有关系,不过我在官方示例中没看出来,好了进入主题,先来看看官方示例。
function *foo(x){
var y=2*(yield(x+1));
var z=yield(y/3);
return (x+y+z);
}
var it=foo(5);
console.log(it.next());
console.log(it.next(12));
console.log(it.next(13));
//返回值是{value: 6, done: false},{value: 8, done: false},{value: 42, done: true}
第一点:foo需要是*型的,新增的*带来的是这个函数指针,这个函数必须是*型的,否则的话var it=foo(5),就表示得到函数执行的结果,而指针型的,表示it取得该函数。
第二点:第一个it.next()表示开始执行函数,直到第一个yield停止。返回值是yield(表达式的值),这个时候的返回时是x+1,x是5,结果就是6. 这里的it.next如果带参数,则参数会被忽略,因为首次执行没有参数可再传递.
第三点:第二个it.next(12)表示上一个yield的返回结果是12,带进去也就是var y=2*12; 这个地方必须带值,因为yield内是表达式(x+1),不是常量,无法自己计算,这里为什么不把之前的x缺省带进去计算,只能说目前的机制不是这样,
应该是考虑到实现的复杂程序,因为这里的x是一个变量,实际运行中,这个还可能是表达式,甚至还有作用域的问题考虑,这里计算出的y=2*12=24,一直计算到下一个yield(24/3),结果是8。
第四点:第三个it.next(13)同样表示上一个yield的返回结果是13,带进去也就是var z=13;后面已经没有yield了,就去函数的返回值return 5+24+13,结果等于42,这个时候done的值是true,表示函数结束。
重要的总结下:function需要是指针,记住yield(表达式)执行的结果是上一个执行的值。
这样yield的关键字是不是清晰了?
在实际工作中并不是it.next()一定要到函数最终的return, 例如第一次执行it.next(),取得返回值不符合预期的值,可以直接不执行后期的next了,例如多层校验。
对ES6的yield示例分析的更多相关文章
- yield示例分析
		yield示例分析 public class TestYield { private static final Object lock = new Object(); public static vo ... 
- ngRx 官方示例分析 - 3. reducers
		上一篇:ngRx 官方示例分析 - 2. Action 管理 这里我们讨论 reducer. 如果你注意的话,会看到在不同的 Action 定义文件中,导出的 Action 类型名称都是 Action ... 
- ngRx 官方示例分析 - 2. Action 管理
		我们从 Action 名称开始. 解决 Action 名称冲突问题 在 ngRx 中,不同的 Action 需要一个 Action Type 进行区分,一般来说,这个 Action Type 是一个字 ... 
- ngRx 官方示例分析 - 1. 介绍
		ngRx 的官方示例演示了在具体的场景中,如何使用 ngRx 管理应用的状态. 示例介绍 示例允许用户通过查询 google 的 book API 来查询图书,并保存自己的精选书籍列表. 菜单有两 ... 
- ROS_Kinetic_29 kamtoa simulation学习与示例分析(一)
		致谢源代码网址:https://github.com/Tutorgaming/kamtoa-simulation kamtoa simulation学习与示例分析(一) 源码学习与分析是学习ROS,包 ... 
- join示例分析
		join示例分析 public class TestJoin { public static void main(String[] args) throws InterruptedException ... 
- Sleep示例分析
		sleep让"当前线程"由“运行状态”进入到“休眠(阻塞)状态”,sleep结束,线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行. 示例分析: pu ... 
- Wait示例分析
		wait方法使"当前线程"进入阻塞(等待)状态. 示例分析: public class TestWait { public static void main(String[] ar ... 
- ivew数控件Tree自定义节点内容示例分析
		ivew数控件Tree自定义节点内容示例分析 demo地址:https://run.iviewui.com/plcWlM4H <template> <Tree :data=" ... 
随机推荐
- 在github上fork项目如何同步并解决冲突
			在github上fork项目如何同步并解决冲突 在github上有些项目我们可能会进行一些自己功能的添加但是提交PR后作者基于设计或者其他原因考虑没有通过,但是这个功能又是我们必须的.这时我们就想自己 ... 
- 2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码
			此文是前文使用现有在线翻译服务进行代码翻译的体验的编程语言方面第二点的一个尝试. 参考Which framework to generate source code ? - Cleancode and ... 
- redis cluster + sentinel详细过程和错误处理三主三备三哨兵
			redis cluster + sentinel详细过程和错误处理三主三备三哨兵1.基本架构192.168.70.215 7001 Master + sentinel 27001192.168.70. ... 
- 多功能设备mfd驱动
			一.概述 mfd是Multifunction device的简称,即多功能设备,是许多有共性的设备的集合,mfd由核心层(core)以及其下的"子设备"组成.从下文将会看到,mfd ... 
- Windows Server 2012 R2 安装密钥(只适用安装,不支持激活)
			标准版 = NB4WH-BBBYV-3MPPC-9RCMV-46XCB 数据中心版 = BH9T4-4N7CW-67J3M-64J36-WW98Y 
- sql xml中 in 的用法
			在xml中,动态传参去数据库查询,下面是in的示例. 比如有条sql SELECT * FROM corp_tax c WHERE c.id in (387419,387423) AND c.corp ... 
- 使用正则替换script及其内容
			因做微信公众号文章保存,发现他的js大多数也用不着,所以就想着用正则替换掉源代码中的js片段 正则代码: <script(?:[^<]++|<(?!/script>))*+&l ... 
- 【Android Studio安装部署系列】四十二、Android Studio使用Eclipse中的keystore为App签名
			版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 从eclipse迁移到AndroidStudio,要用原Eclipse的签名文件,这样才能保证转到AndroidStudio后更新的 ... 
- PhotoPickerNewDemo【PhotoPicker0.9.12的个性化修改以及使用(内部glide版本号是4.1.1)】
			版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo使用的是PhotoPicker 0.9.12版本,里面集成的glide版本号是4.1.1.这里就不进行特殊的个性化处理了( ... 
- springboot~Mongodb的集成与使用
			说说springboot与大叔lind.ddd的渊源 Mongodb在Lind.DDD中被二次封装过(大叔的.net和.net core),将它当成是一种仓储来使用,对于开发人员来说只公开curd几个 ... 
