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 相关文章推荐
jQuery学习笔记之jQuery选择器的使用
Dec 22 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
Dec 04 Javascript
javascript实现文字图片上下滚动的具体实例
Jun 28 Javascript
深入领悟JavaScript中的面向对象
Nov 18 Javascript
jquery调取json数据实现省市级联的方法
Jan 29 Javascript
jfinal与bootstrap的登录跳转实战演习
Sep 22 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
Apr 15 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
jQuery使用bind函数实现绑定多个事件的方法
Oct 11 jQuery
手把手教你写一个微信小程序(推荐)
Oct 17 Javascript
Vue.js中对css的操作(修改)具体方式详解
Oct 30 Javascript
vue-dplayer 视频播放器实例代码
Nov 08 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
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
php调用Google translate_tts api实现代码
2013/08/07 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
javascript Array对象基础知识小结
2010/11/16 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
python中管道用法入门实例
2015/06/04 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
Django中的cookie和session
2019/08/27 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
政治表现评语
2014/05/04 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
通知函的格式
2015/04/27 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
Vue3中的Refs和Ref详情
2021/11/11 Vue.js
vue中div禁止点击事件的实现
2022/04/02 Vue.js
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript