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 相关文章推荐
检测是否已安装 .NET Framework 3.5的js脚本
Feb 14 Javascript
快速查找数组中的某个元素并返回下标示例
Sep 03 Javascript
javascipt匹配单行和多行注释的正则表达式
Nov 20 Javascript
javascript:void(0)的问题使用探讨
Apr 10 Javascript
js检测网络是否具体连接功能的代码
May 23 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
Sep 14 Javascript
关于 jQuery Easyui异步加载tree的问题解析
Dec 06 Javascript
js判断手机号是否正确并返回的实现代码
Jan 17 Javascript
详解jQuery中ajax.load()方法
Jan 25 Javascript
JS实现数组的增删改查操作示例
Aug 29 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
May 27 Javascript
微信公众号菜单配置微信小程序实例详解
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
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
pm2 部署 node的三种方法示例
2017/10/20 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python命令行参数sys.argv使用示例
2014/01/28 Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
python实现俄罗斯方块
2018/06/26 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
Python pip 常用命令汇总
2020/10/19 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
节约用水的口号
2014/06/20 职场文书
担保书范本
2015/01/20 职场文书
开学第一周总结
2015/07/16 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers