对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=" ...
随机推荐
- Java实现文本编辑时基于拼音输入的补全原型
续前文Java实现"命令式"简易文本编辑器原型. 效果如下: 所在源码库同上文, 尚未和上文的编辑器右侧的命令区集成. 代码由How to show autocomplete as ...
- 从一个git仓库拷贝到另一个git仓库
利用git从一个仓库拷贝一个项目到另一个仓库,并且log也能够一起过去. 1.从原地址克隆一份裸版本库,比如原本托管于 GitHub. git clone --bare http://github.. ...
- HTML5 input date属性引起的探索——My97DatePicker(日期选择插件)
不得不说H5的input date属性真的好用,之前我写的http://www.cnblogs.com/tu-0718/p/6729274.html这篇博客里面也有提到,不过虽然移动端对H5的支持还是 ...
- 知识小罐头06(tomcat8请求源码分析 中)
更正上一篇一个小错误,Connector中首先是将socket请求过来的信息封装成一个普通的Request对象(上一篇我写成HttpRequest对象,失误失误,根本就木有HttpRequest这样的 ...
- springboot~内嵌redis的使用
对于单元测试来说,我们应该让它尽量保持单一环境,不要与网络资源相通讯,这样可以保证测试的稳定性与客观性,对于springboot这个框架来说,它集成了单元测试JUNIT,同时在设计项目时,你可以使用多 ...
- Spring入门(三):通过JavaConfig装配bean
上一篇博客中,我们讲解了使用组件扫描和自动装配实现自动化装配bean,这也是最好的使用方式. 但是某些场景下,我们可能无法使用自动装配的功能,此时就不得不显式的配置bean. 比如我们引用了一个第三方 ...
- OGNL详解
A.什么是OGNL? 全称叫ObjectGraphic Navigation Language(对象图导航语言),它是struts2框架里面的第三方语言(即可以再别的地方用,struts2只是拿过来了 ...
- 005. [转] SSH端口转发
玩转SSH端口转发 SSH有三种端口转发模式,本地端口转发(Local Port Forwarding),远程端口转发(Remote Port Forwarding)以及动态端口转发(Dynamic ...
- c#调用word文件
大家好!我叫蓝颜,我是一名大专生.这是我第一次接触博客园,以后也会一直在. 在学校期间,参加技能大赛(物联网),接触到的C#.之后学校教务处要一个调课软件, 于是我就小试牛刀试了试.当然了,这也是我第 ...
- Math.floor(Math.random()*3+1)
Math.random():获取0~1随机数 Math.floor() method rounds a number DOWNWARDS to the nearest integer, and ret ...