聊聊ES6中的generator
generator
generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但函数执行中间可以停止。
ES6定义generator标准的哥们借鉴了Python的generator的概念和语法。
话说回来,generator有什么用呢,让我们通过几个函数来看一看它的作用:
//普通函数——一路到底
function show() {
alert('a');
alert('b');
}
show();
这个函数执行后会弹出a 和 弹出b,那么,我们能不能让他在 弹出a之后停下呢,下面就需要借助我们的generator函数了。
//generatro函数——中间能停
function *show() {
alert('a'); alert('b');
}
show();
我们发现,这个函数名字前面 有个 * ,这就是generator函数的特点,当然了,*可以和函数名贴在一起,可以和function贴在一起,也可以谁都不贴,直接放中间,就是不能连起来写,像这种
function*show() {
alert('a');
alert('b');
}
show();
现在generator函数有了,你得告诉它在哪停呀,有个东西叫 yield,又到了ask开心学英语时间,yield翻译过来有屈服、投降、生产等意思,在咱们函数里,取“放弃”的意思,简单理解为暂时放弃控制权,等过一会再把控制权还给我。
//generatro函数——中间能停
function*show() {
alert('a'); yield; alert('b');
}
show();
我们运行上面函数的时候发现,哎,函数没有执行,也没有报错,这是咋回事呢?
这也是generator和普通函数的区别,当函数执行的时候,并不会执行函数里面的内容,而是创建了一个generator对象。
//generatro函数——中间能停
function *show() {
alert('a'); yield; //放弃、暂停 alert('b');
} let genObj = show();
console.log(genObj); //这里面有个特别重要的方法
genObj.next(); //对,就是这里写到的next()方法
这里代码执行的时候,会弹出a,我们在后面再写一个 next ,这样执行的时候,会弹出a和b,说白了就是踹一脚走一步。
在这里大家可能会奇怪了,我现在知道了generator配合yield可以让函数走走停停,但我为什么要让它停呢,其实很简答,就像我们平时坐出租车会让师傅停下来等我们忙活其他的事,事情忙完之后再让师傅继续开一样。generator和yield特别适用于请求数据的场景,下面看代码:
function 函数(){
//代码
ajax(xxx,function(){
///代码...
})
}
正常来讲,我们想用到请求来的一些数据,那么就需要我们将用数据的代码放在ajax请求成功之后, 然后就导致了我们所谓的回调函数,回调里面还有回调,最后产生了一大堆代码。
function *函数(){
//代码
yield ajax(xxx)
///代码...
}
而如果是generator函数,我们可以在请求数据的时候,可以让函数暂停,等请求结束之后,函数再接着去执行,这样就不用写成回调的那种方式。
上面两段代码,我们可以看出来,普通函数涉及到异步操作的时候,我们只能通过回调来写,但在generator函数里,我们可以等待数据请求结束,然后再去执行下面的函数。
那么generator是如何做到让函数走走停停的呢?这其实就是generator名字的由来,生成
function *show() {
alert('a');
yield; //放弃、暂停
alert('b');
}
function show_1() {
alert('a');
}
function show_2() {
alert('b');
}
let genObj = show();
console.log(genObj);
genObj.next(); //show_1()
genObj.next(); //show_2()
拿我们第一次写的函数来看吧,它将我们写的一个函数show,拆分成了两个小函数,show_1,show_2,这样就能实现我们看到的走走停停效果。
到这里,generator函数的简单运用,相信大家已经学会了,但是大家可能对文章中提到的yield不是特别了解,而yield也是generator中最不好理解的一个东西,能不能把它掌握,很大程度上决定了我们学习generator的好坏,也是因为yield比较重要,打算放在下面一篇文章中,大家感兴趣的话,可以继续关注我哦
聊聊ES6中的generator的更多相关文章
- ES6中的Generator函数
今天小编发现一个es6中的新概念,同时也接触到了一个新关键字yeild,下面我就简单和大家聊聊es6中的generator函数.大家还可以关注我的微信公众号,蜗牛全栈. 一.函数声明:在functio ...
- es6 中的generator函数控制流程
Generator函数跟普通函数的写法有非常大的区别: 一是,function关键字与函数名之间有一个星号: 二是,函数体内部使用yield语句,定义不同的内部状态(yield在英语里的意思就是“产出 ...
- 聊聊 ES6 中的箭头函数
首先来两点: 当只有一个参数的时候,那么 () 可以省略 当只有一个 return 的时候,那么 {} 可以省略 当函数体内只有一条语句的时候,那么 {} 也可以省略 下面来几个简单的例子来对比 ES ...
- ES6中的迭代器、Generator函数以及Generator函数的异步操作
最近在写RN相关的东西,其中涉及到了redux-saga ,saga的实现原理就是ES6中的Generator函数,而Generator函数又和迭代器有着密不可分的关系.所以本篇博客先学习总结了ite ...
- ES6中的迭代器(Iterator)和生成器(Generator)
前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简 ...
- ES6中Generator
ES6中Generator Generator是ES6一个很有意思的特性,也是不容易理解的特性.不同于let/const提供了块级作用域这样明显的目的,这玩意儿被搞出来到底是干嘛的? 首先我们需要明确 ...
- ES6中的Promise和Generator详解
目录 简介 Promise 什么是Promise Promise的特点 Promise的优点 Promise的缺点 Promise的用法 Promise的执行顺序 Promise.prototype. ...
- ES6中的迭代器(Iterator)和生成器(Generator)(二)
一.内建迭代器 迭代器是ES6的一个重要组成部分,在ES6中,已经默认为许多内建类型提供了内建迭代器,只有当这些内建迭代器无法实现目标时才需要自己创建.通常来说当定义自己的对象和类时才会遇到这种情况, ...
- ES6中的迭代器(Iterator)和生成器(Generator)(一)
用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...
随机推荐
- [egret+pomelo]实时对战游戏杂记(5)
之前大体了解了pomelo服务端的运行的大体运行流程,下面详细的学习一下在服务端比较重要的一个容器模块bearcat,在bearcat的wiki中我们可以对其有个大概的了解,在服务端示例的代码中也大量 ...
- 51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 1084 矩阵取数问题 V2 基准时间限制:2 秒 空 ...
- Mysql中文检索匹配与正则
今天在用sql模糊查询包含字母d的时候,发现一些不包含此字母的也被查询出来了: SELECT * FROM custom WHERE custom_realname LIKE '%d%' 查询了一下, ...
- java数据的5种存储位置(转)
任何语言所编写的程序,其中的各类型的数据都需要一个存储位置,java中书的存储位置分为以下5种: 1.寄存器 最快的存储区,位于处理器内部,但是数量及其有限.所以寄存器根据需求自动分配,无序人为控制. ...
- 常用SASS封装
结合Compass库和工作总结,列出了项目中最为常用的SASS片段.内容收集于网络,我进行了简单整理并测试正常,可以根据实际项目情况进行取舍,值得学习或直接应用,感谢! //重置浏览器默认样式@imp ...
- Codeforces Round #397 题解
Problem A. Neverending competitions 题目大意 一个团队有多个比赛,每次去比赛都会先订机票去比赛地点,然后再订机票返回.给出\(n\)个含有起止地点的购票记录(不按时 ...
- 【算法模板】Binary Search 二分查找
模板:(通用模板,推荐) 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. ...
- plsql developer点滴
PLSql中查看编译错误的具体内容: 1. 打开Command Windows show errors procedure procedure_name
- AI-Info-Micron-Insight:Micron 美光的技术帮助 CERN 解开宇宙奥秘
ylbtech-AI-Info-Micron-Insight:Micron 美光的技术帮助 CERN 解开宇宙奥秘 1.返回顶部 1. Micron 美光的技术帮助 CERN 解开宇宙奥秘 大约 14 ...
- NGUI panel 之下widget最大depth是1000,超过1000时OnClick会出问题!
经过我的测试发现ngui widget的depth是有限制的!原本以为只要不同panel间的depth设置好了后无论widget depth如何设置都没问题,直到我们项目中出现奇怪的点击问题后才发现这 ...