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 13 Javascript
javascript的数据类型、字面量、变量介绍
May 23 Javascript
js Dialog 实践分享
Oct 22 Javascript
将Datatable转化成json发送前台实现思路
Sep 06 Javascript
浅谈页面装载js及性能分析方法
Dec 09 Javascript
JavaScript实现网站访问次数统计代码
Aug 12 Javascript
jQuery Pagination分页插件使用方法详解
Feb 28 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
Dec 13 Javascript
javascript将json格式数组下载为excel表格的方法
Dec 22 Javascript
vue cli webpack中使用sass的方法
Feb 24 Javascript
js隐式转换的知识实例讲解
Sep 28 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
Dec 19 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下载生成的csv文件及问题总结
2015/08/06 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
jQuery函数的等价原生函数代码示例
2013/05/27 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
JS常用函数使用指南
2014/11/23 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
理解javascript对象继承
2016/04/17 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
python 输出一个两行字符的变量
2009/02/05 Python
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
Python文件的读写和异常代码示例
2017/10/31 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
一行Python代码制作动态二维码的实现
2019/09/09 Python
浅析Python 多行匹配模式
2020/07/24 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
青年文明号事迹材料
2014/01/18 职场文书
公司活动总结怎么写
2014/06/25 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
市场总监岗位职责
2015/02/11 职场文书
2015年实习单位评语
2015/03/25 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
浅析Django接口版本控制
2021/06/26 Python