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.drag)使用介绍
Jun 18 Javascript
JS实现闪动的title消息提醒效果
Jun 20 Javascript
基于Javascript实现弹出页面效果
Jan 01 Javascript
jQuery实现的可编辑表格完整实例
Jun 20 Javascript
vue.js简单配置axios的方法详解
Dec 13 Javascript
微信小程序实现人脸检测功能
May 25 Javascript
JavaScript日期工具类DateUtils定义与用法示例
Sep 03 Javascript
微信小程序使用map组件实现解析经纬度功能示例
Jan 22 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
Feb 19 jQuery
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
Mar 30 Javascript
jQuery轮播图功能制作方法详解
Dec 03 jQuery
js 图片懒加载的实现
Oct 21 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
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
DOM 事件流详解
2015/01/20 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
小程序如何获取多个formId实现详解
2019/09/20 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Djang中静态文件配置方法
2015/07/30 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
python实现简易通讯录修改版
2018/03/13 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
django-初始配置(纯手写)详解
2019/07/30 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
八年级生物教学反思
2014/01/22 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
小学教师师德承诺书
2014/05/23 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
中学生逃课检讨书
2015/02/17 职场文书
《青山不老》教学反思
2016/02/22 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
golang中的空接口使用详解
2021/03/30 Python