ES6中Generator与异步操作实例分析


Posted in Javascript onMarch 31, 2017

本文实例讲述了ES6中Generator与异步操作。分享给大家供大家参考,具体如下:

Generator与异步操作

1.Generator概念

可以把Generator理解成一个状态机(好像React中有很多state),封装了多个内部状态。执行Generator返回的是一个遍历器对象,可以遍历Generator产生的每一个状态。在function后加*就可以声明一个Generator函数。

function* hiGenerator(){
yield 'hi';
yield 'ES5';
return '!';
}
var hi = hiGenerator();
console.log(hi); //hiGenerator {[[GeneratorStatus]]: "suspended", [[GeneratorReceiver]]: Window}
console.log(hi.next()); //Object {value: "hi", done: false}
console.log(hi.next()); //Object {value: "ES5", done: false}
console.log(hi.next()); //Object {value: "!", done: true}

2.yield语句

由于Generator函数返回的遍历器对象,只有调用next()方法才会遍历到下一个状态,所以其实提供了一种可以暂停的执行函数。每次执行next(),遇到yield语句就暂停执行,且将yield后的表达式的值作为返回的对象的value值;如果没有遇到yield,则返回return语句作为返回对象的value值;如果没有return,则返回对象的value值为undefined。

3.next方法

next()方法可以带一个参数,该参数会被当做上一条yield语句的返回值。

function* add(c, d){
var a = 0;
a = yield a + c;
a = yield a + d;
return
}
var sum = add(1, 2);
console.log(sum); //add {[[GeneratorStatus]]: "suspended", [[GeneratorReceiver]]: Window}
console.log(sum.next()); //Object {value: 1, done: false}
console.log(sum.next()); //Object {value: NaN, done: false}
console.log(sum.next()); //Object {value: undefined, done: true}

如果不给next()传参,会使得下一步计算无法进行。

function* add(c, d){
var a = 0;
a = yield a + c;
a = yield a + d + 1;
return
}
var sum = add(1, 2);
console.log(sum); //add {[[GeneratorStatus]]: "suspended", [[GeneratorReceiver]]: Window}
console.log(sum.next()); //Object {value: 1, done: false}
console.log(sum.next(1)); //Object {value: 4, done: false}
console.log(sum.next(3)); //Object {value: undefined, done: true}

4.用for..of...遍历Generator

用for..of...遍历Generator时候,不需要显示调用next()方法。

5.一个Generator函数产生的遍历器对象g调用return方法后,返回对象的value属性为return方法的参数。

6.在一个Generator函数内部调用另一个Generator函数。需要使用yield*。

希望本文所述对大家ECMAScript程序设计有所帮助。

Javascript 相关文章推荐
Javascript引用指针使用介绍
Nov 07 Javascript
用javascript对一个json数组深度赋值示例
Jul 27 Javascript
javascript HTML5文件上传FileReader API
Mar 27 Javascript
JQuery遍历元素的后代和同胞实现方法
Sep 18 Javascript
JavaScript实现窗口抖动效果
Oct 19 Javascript
解析js如何获取css样式
Dec 11 Javascript
JavaScript学习笔记之数组基本操作示例
Jan 09 Javascript
jquery实现进度条状态展示
Mar 26 jQuery
JavaScript常用进制转换及位运算实例解析
Oct 14 Javascript
Vue实现下拉加载更多
May 09 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
微信公众号菜单配置微信小程序实例详解
Mar 31 #Javascript
ES6中Iterator与for..of..遍历用法分析
Mar 31 #Javascript
node.js平台下的mysql数据库配置及连接
Mar 31 #Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
Mar 31 #Javascript
angular.JS实现网页禁用调试、复制和剪切
Mar 31 #Javascript
angular.js+node.js实现下载图片处理详解
Mar 31 #Javascript
JavaScript函数柯里化原理与用法分析
Mar 31 #Javascript
You might like
PHP对象克隆clone用法示例
2016/09/28 PHP
php的扩展写法总结
2019/05/14 PHP
js 居中漂浮广告
2010/03/21 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
Python 错误和异常小结
2013/10/09 Python
python中根据字符串调用函数的实现方法
2016/06/12 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
Python的高阶函数用法实例分析
2019/04/11 Python
基于Python函数和变量名解析
2019/07/19 Python
python压包的概念及实例详解
2021/02/17 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
Oracle性能调优原则
2012/05/03 面试题
建筑学推荐信
2013/11/03 职场文书
销售实习自我鉴定
2013/12/07 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
室内趣味活动方案
2014/08/24 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android