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 相关文章推荐
Jquery Select操作方法集合脚本之家特别版
May 17 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
Feb 05 Javascript
jQuery中slice()方法用法实例
Jan 07 Javascript
JS实现设置ff与ie元素绝对位置的方法
Mar 08 Javascript
用headjs来管理和加载js 提高网站加载速度
Nov 29 Javascript
深入浅析javascript继承体系
Oct 23 Javascript
基于JavaScript 性能优化技巧心得(分享)
Dec 11 Javascript
vue组件 keep-alive 和 transition 使用详解
Oct 11 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
Nov 01 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
Nov 13 Javascript
Openlayers实现地图全屏显示
Sep 28 Javascript
Javascript实现关闭广告效果
Jan 29 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
php网页病毒清除类
2014/12/08 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
JS查看对象功能代码
2008/04/25 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
javascript的BOM汇总
2015/07/16 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
解决python 自动安装缺少模块的问题
2018/10/22 Python
python实现维吉尼亚加密法
2019/03/20 Python
python实现远程控制电脑
2019/05/23 Python
python 列表推导式使用详解
2019/08/29 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
Python实现名片管理系统
2020/02/14 Python
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
会议欢迎词范文
2015/01/27 职场文书
高中班主任心得体会
2016/01/07 职场文书
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang