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复制文本框和表格的代码
Apr 01 Javascript
jquery load事件(callback/data)使用方法及注意事项
Feb 06 Javascript
javascript针对不确定函数的执行方法
Dec 16 Javascript
JS中的数组方法笔记整理
Jul 26 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
Oct 14 Javascript
前端分页功能的实现以及原理(jQuery)
Jan 22 Javascript
详解Webpack DLL用法以及功能
Jul 11 Javascript
javascript代码优化的8点总结
Jan 29 Javascript
React 组件中的 bind(this)示例代码
Sep 16 Javascript
ajaxfileupload.js实现上传文件功能
Apr 19 Javascript
用js编写留言板
Mar 17 Javascript
JavaScript实现留言板案例
Mar 17 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稳定的curl_get_contents分享
2012/01/11 PHP
基于php 随机数的深入理解
2013/06/05 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
js玩一玩WSH吧
2007/02/23 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
jQuery通过Ajax返回JSON数据
2015/04/28 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
Angularjs Promise实例详解
2018/03/15 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
浅析PyTorch中nn.Module的使用
2019/08/18 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
python如何删除列为空的行
2020/07/17 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
促销活动总结范文
2014/04/30 职场文书
护士工作失误检讨书
2014/09/14 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
Django程序的优化技巧
2021/04/29 Python
oracle数据库去除重复数据
2022/05/20 Oracle