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 相关文章推荐
input、button的不同type值在ajax提交表单时导致的陷阱
Feb 24 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
Aug 25 Javascript
Js实现滚动变色的文字效果
Jun 16 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
Mar 13 Javascript
JavaScript输出所选择起始与结束日期的方法
Jul 12 Javascript
jQuery中extend函数简单用法示例
Oct 11 jQuery
纯js封装的ajax功能函数与用法示例
May 14 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
May 30 Javascript
react 移动端实现列表左滑删除的示例代码
Jul 04 Javascript
JavaScript Date对象功能与用法学习记录
Apr 28 Javascript
js+css3实现炫酷时钟
Aug 18 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
PHP4中实现动态代理
2006/10/09 PHP
用来给图片加水印的PHP类
2008/04/09 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
Python随机生成彩票号码的方法
2015/03/05 Python
Python用模块pytz来转换时区
2016/08/19 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
Python线程指南分享
2019/11/19 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
Python实现EM算法实例代码
2020/10/04 Python
公司出纳岗位职责
2013/12/07 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
实习协议书范本
2014/04/22 职场文书
个人承诺书怎么写
2014/05/24 职场文书
学校周年庆活动方案
2014/08/22 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
初中体育课教学反思
2016/02/16 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技