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滚动条多种样式,推荐
Feb 05 Javascript
Google排名中的10个最著名的 JavaScript库
Apr 27 Javascript
jquery 中的each()跳出循环的语句
May 23 Javascript
Node.js 的异步 IO 性能探讨
Oct 08 Javascript
jquery利用拖拽方式在图片上添加热链接
Nov 24 Javascript
JavaScript定义全局对象的方法示例
Jan 12 Javascript
Node.js实现发送邮件功能
Nov 06 Javascript
Vue.js进阶知识点总结
Apr 01 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 Javascript
javascript中this的用法实践分析
Jul 29 Javascript
javascript合并两个数组最简单的实现方法
Sep 14 Javascript
javascript实现超好看的3D烟花特效
Jan 01 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
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
php实现登录页面的简单实例
2019/09/29 PHP
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
基于element-ui的rules中正则表达式
2018/09/04 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
js闭包的9个使用场景
2020/12/29 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
python3中函数参数的四种简单用法
2018/07/09 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
苹果香港官方商城:Apple香港
2016/09/14 全球购物
办公室经理岗位职责
2014/01/01 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
白酒营销策划方案
2014/08/17 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
2015年新教师工作总结
2015/04/28 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
小学班主任工作随笔
2015/08/15 职场文书
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
2021/04/22 HTML / CSS
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server
Nginx配置根据url参数重定向
2022/04/11 Servers