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 相关文章推荐
js 图片随机不定向浮动的实现代码
Jul 02 Javascript
jquery 循环显示div的示例代码
Oct 18 Javascript
基于jquery实现的自动补全功能
Mar 12 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
Oct 08 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
Feb 10 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
Mar 14 Javascript
解决循环中setTimeout执行顺序的问题
Jun 20 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
Nov 14 Javascript
详解js加减乘除精确计算
Mar 19 Javascript
JS实现的自定义map方法示例
May 17 Javascript
Vue内部渲染视图的方法
Sep 02 Javascript
vue中实现动态生成二维码的方法
Feb 21 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
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
php实现生成验证码实例分享
2016/04/10 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
JS实现给对象动态添加属性的方法
2017/01/05 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
浅谈Python中copy()方法的使用
2015/05/21 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Python 如何在字符串中插入变量
2020/08/01 Python
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
高校教师思想汇报
2014/01/11 职场文书
音乐专业自荐信
2014/02/07 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
2014年车间工作总结
2014/11/21 职场文书
文明班级申报材料
2014/12/24 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
Selenium浏览器自动化如何上传文件
2022/04/06 Python