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 相关文章推荐
js身份证验证超强脚本
Oct 26 Javascript
jquery中的$(document).ready()与window.onload的区别
Nov 18 Javascript
js文件缓存之版本管理详解
Jul 05 Javascript
浅谈jQuery效果函数
Sep 16 Javascript
AngularJS实现在ng-Options加上index的解决方法
Nov 03 Javascript
jQuery简介_动力节点Java学院整理
Jul 04 jQuery
浅谈Webpack打包优化技巧
Jun 12 Javascript
node.js实现微信开发之获取用户授权
Mar 18 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
May 27 Javascript
vue-router为激活的路由设置样式操作
Jul 18 Javascript
vue 单页应用和多页应用的优劣
Oct 22 Javascript
vue+iview实现文件上传
Nov 17 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报表之jpgraph柱状图实例代码
2011/08/22 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
在js中使用"with"语句中跨frame的变量引用问题
2007/03/08 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
Python实现通过继承覆盖方法示例
2018/07/02 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
python实现电子产品商店
2019/02/26 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
2014年清明节寄语
2014/04/03 职场文书
见习报告格式要求
2014/11/04 职场文书
单位计划生育责任书
2015/05/09 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
mysq启动失败问题及场景分析
2021/07/15 MySQL
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android
浅谈Node的内存泄露问题
2022/05/06 NodeJs