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 相关文章推荐
再次分享18个非常棒的jQuery表格插件
Apr 10 Javascript
JQuery select控件的相关操作实现代码
Sep 14 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
Nov 24 Javascript
jQuery中focus事件用法实例
Dec 26 Javascript
jquery $(document).ready()和window.onload的区别浅析
Feb 04 Javascript
angularJS 中input示例分享
Feb 09 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
May 12 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
Jul 22 Javascript
JavaScript  event对象整理及详细介绍
Oct 10 Javascript
使用React手写一个对话框或模态框的方法示例
Apr 25 Javascript
JS数据类型STRING使用实例解析
Dec 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
PHP树的代码,可以嵌套任意层
2006/10/09 PHP
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
php && 逻辑与运算符使用说明
2010/03/04 PHP
解析strtr函数的效率问题
2013/06/26 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
smarty模板数学运算示例
2016/12/11 PHP
[JS]点出统计器
2020/10/11 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
JavaScript入门基础
2015/08/12 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
python sys模块sys.path使用方法示例
2013/12/04 Python
pycharm 使用心得(五)断点调试
2014/06/06 Python
Python正则表达式匹配HTML页面编码
2015/04/08 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
python opencv进行图像拼接
2020/03/27 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
C面试题
2015/10/08 面试题
新闻人物通讯稿
2014/10/09 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
公司慰问信范文
2015/03/23 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python