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 事件冒泡简介及应用
Jan 11 Javascript
javascript异步编程的4种方法
Feb 19 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
Oct 22 Javascript
jQuery中复合属性选择器用法实例
Dec 31 Javascript
日常收藏的jquery技巧
Dec 02 Javascript
jQuery zTree加载树形菜单功能
Feb 25 Javascript
Angular.js中用ng-repeat-start实现自定义显示
Oct 18 Javascript
js实现定时进度条完成后切换图片
Jan 04 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 Javascript
requirejs + vue 项目搭建详解
Jun 16 Javascript
JavaScript实现QQ列表展开收缩扩展功能
Oct 30 Javascript
小程序页面动态配置实现方法
Feb 05 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 文章调用类代码
2011/08/11 PHP
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
php实现httpclient类示例
2014/04/08 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
javascript知识点收藏
2007/02/22 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
JavaScript知识点整理
2015/12/09 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
Django小白教程之Django用户注册与登录
2016/04/22 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
Numpy的简单用法小结
2019/08/28 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
python 安装移动复制第三方库操作
2020/07/13 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
类的返射机制中的包及核心类
2016/09/12 面试题
cf战队收人口号
2014/06/21 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android