ES6 Generator基本使用方法示例


Posted in Javascript onJune 06, 2020

本文实例讲述了ES6 Generator基本使用方法。分享给大家供大家参考,具体如下:

1.Generator介绍

先来一段Generator的基础代码

function* g(){
 yield 100;
 yield 200;
 return 300;
}
let gg = g();
console.log(gg);            // Object [Generator] {}
console.log(gg.next());        // { value: 100, done: false }
console.log(gg.next());        // { value: 200, done: false }
console.log(gg.next());        // { value: 300, done: true }
console.log(gg.next());        // { value: undefined, done: true }

首先我们看到:

  • Generator是由functinon*定义的,在generator内部可以使用yield
  • Generator不是函数,而是一个对象,并且在执行开始就进入暂停状态,而不是直接执行全部操作
  • 通过next()来执行下一步操作,返回的都是{ value: xxx, done: xxx }这样的形式,value代表上一次操作返回的值,done有两个值,一个是true,一个是false,表示整个流程是否全部结束。

2.Generator异步编程

generator是ES6中引入的异步解决方案,我们来看看它与promise处理异步的对比,来看它们的差异。

// 这里模拟了一个异步操作
function asyncFunc(data) {
 return new Promise( resolve => {
  setTimeout(
   function() {
    resolve(data)
   },1000
  )
 })
}

promise的处理方式:

asyncFunc("abc").then( res => {
 console.log(res);                    // "abc"
 return asyncFunc("def")
}).then( res => {
 console.log(res);                    // "def"
 return asyncFunc("ghi")
}).then( res => {
 console.log(res);                    // "ghi"
})

generator的处理方式:

function* g() {
 const r1 = yield asyncFunc("abc");
 console.log(r1);                            // "abc"
 const r2 = yield asyncFunc("def");
 console.log(r2);                            // "def"
 const r3 = yield asyncFunc("ghi");
 console.log(r3);                            // "ghi"
}

let gg = g();
let r1 = gg.next();
r1.value.then(res => {
 let r2 = gg.next(res);
 r2.value.then(res => {
  let r3 = gg.next(res);
  r3.value.then(res => {
   gg.next(res)
  })
 })
})

promise多次回调显得比较复杂,代码也不够简洁,generator在异步处理上看似同步的代码,实际是异步的操作,唯一就是在处理上会相对复杂,如果只进行一次异步操作,generator更合适。

3.yield和yield*

先来看两段代码

function* g1() {
 yield 100;
 yield g2();
 return 400;
}

function* g2() {
 yield 200;
 yield 300;
}

let gg = g1();
console.log(gg.next());                // { value: 100, done: false }
console.log(gg.next());                // { value: Object [Generator] {}, done: false }
console.log(gg.next());                // { value: 400, done: true }
console.log(gg.next());                // { value: undefined, done: true }
function* g1() {
 yield 100;
 yield* g2();
 return 400;
}

function* g2() {
 yield 200;
 yield 300;
}

let gg = g1();
console.log(gg.next());                // { value: 100, done: false }
console.log(gg.next());                // { value: 200, done: false }
console.log(gg.next());                // { value: 300, done: false }
console.log(gg.next());                // { value: 400, done: true }

yield对另一个generator不会进行遍历,返回的是迭代器对象,而yield*会对generator进行遍历迭代。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

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

Javascript 相关文章推荐
Javascript 构造函数,公有,私有特权和静态成员定义方法
Nov 30 Javascript
Javascript 类型转换方法
Oct 24 Javascript
javascript取消文本选定的实现代码
Nov 14 Javascript
js 图片随机不定向浮动的实现代码
Jul 02 Javascript
JS两种定义方式的区别、内部原理
Nov 21 Javascript
JavaScript实现简单的二级导航菜单实例
Apr 15 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
Dec 02 Javascript
通过JS获取Request.QueryString()参数的值实现方法
Sep 27 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
Aug 25 Javascript
微信小程序实现列表下拉刷新上拉加载
Jul 29 Javascript
vue axios请求超时的正确处理方法
Apr 02 Javascript
vue 登录滑动验证实现代码
Aug 24 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
Jun 06 #jQuery
ES6 Symbol在对象中的作用实例分析
Jun 06 #Javascript
微信小程序多列表渲染数据开关互不影响的实现
Jun 05 #Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
Jun 05 #Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
Jun 05 #Javascript
Node.js API详解之 dgram模块用法实例分析
Jun 05 #Javascript
taro 实现购物车逻辑的实例代码
Jun 05 #Javascript
You might like
轻松修复Discuz!数据库
2008/05/03 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
php过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
2016/04/13 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
vue中的计算属性和侦听属性
2020/11/06 Javascript
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
django admin 后台实现三级联动的示例代码
2018/06/22 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
python numpy存取文件的方式
2020/04/01 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
办公室主任职责范文
2013/11/08 职场文书
总经理助理岗位职责
2013/11/08 职场文书
试用期员工考核制度
2014/01/22 职场文书
科技活动周标语
2014/10/08 职场文书
邀请书模板
2015/02/02 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
图书借阅制度范本
2015/08/06 职场文书
运动会200米广播稿
2015/08/19 职场文书
资产移交协议书
2016/03/24 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
Python必备技巧之函数的使用详解
2022/04/04 Python