Generator究竟有什么样的作用呢????

  • 他是ES6提出的一个解决异步问题方案

先看一段代码, 感受一下generator函数和普通函数的区别

   function* test(){
yield 2;
yield 3;
yield 5;
}
var app = test() // 此时代码不会执行
var a = app.next() // 这个时候代码才开始真正开始执行
console.log(a) // {value:2,done:false}
var b = app.next() // 继续执行
console.log(b) // {value:3,done:false}
var b = app.next() // 最后一步
console.log(b) // {value:5,done:true}

从上面的代码可以看出来,generator可以让函数在写的时候停止运行,就好比我们在打断点的时候,那么我就在想,如果我写异步函数是不是也可以让他停止呢,激动的我赶紧试了一下

function* getTime(){
//这里我就用axios打个比方,就不写一段promise了,大家理解这里可以放一个promise就行
yield axios.get('xxxxx')
}
var app = getTime()
app.next() // {value,done} 这里面的value就是返回的axios数据
  • 总结一下,那么generator就是针对异步的一种解决方法
  • 既然了解了他的用处,那么我们就来好好学习一下如何去使用他

使用Promise

  • Promise的书写规范是什么
// 在写函数的时候必须用一个*
function* add(){}
function *add(){}
// 那么在es6之后函数可以写成
get(){
...
}
//所以还有另外一种写法
*get(){ }
  • Promise如何使用

这时候需要了解一个关键字 yield 这个关键字必须在generator函数内,就好比await必须用在async内部一样

var app = test()  //test是一个generator函数
app.next() //会把程序中的yield后面的值拿出来,并且吧yield后面的数据传递给返回的对象的value中
//例如
function *test(){
yield 2
}
test().next() //test()本身不会执行,当调用next的时候才会执行,就是返回一个对象 {value:2,done:true}
//再理解一下,yield后面的值赋给了value,done是指generator函数后面还存在return或者yield等程序,就是后面时候还有代码段
  • 那么我们会写generator函数了,并且也会调用了
  • 如果还能传递参数了,那么我们这个函数岂不是用起来很完美么
function* test(){
console.log('程序开始了')
console.log(`1.${yield}`) //这里面我们使用es6的字符串插值方式
console.log(`2.${yield}`) //这里面我们调用
}
var app = test() //这个时候只是让app变成一个指向generator函数的指针,并不会打印出值来
app.next()
app.next('第一步')
app.next('第二步')
//接下来就是打印的结果了
程序开始执行了
1.第一步
2.第二步
  • 分享不易,感谢关注

详谈Generator的更多相关文章

  1. EasyMesh - A Two-Dimensional Quality Mesh Generator

    EasyMesh - A Two-Dimensional Quality Mesh Generator eryar@163.com Abstract. EasyMesh is developed by ...

  2. 轻量级“集合”迭代器-Generator

    Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...

  3. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  4. 深入解析js异步编程利器Generator

    我们在编写Nodejs程序时,经常会用到回调函数,在一个操作执行完成之后对返回的数据进行处理,我简单的理解它为异步编程. 如果操作很多,那么回调的嵌套就会必不可少,那么如果操作非常多,那么回调的嵌套就 ...

  5. mybatis Generator生成代码及使用方式

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5889312.html 为什么要有mybatis mybatis 是一个 Java 的 ORM 框架,OR ...

  6. ABP配套代码生成器(ABP Code Generator)帮助文档,实现快速开发

    ABP代码生成器介绍 针对abp这个框架做了一个代码生成器,功能强大.分为两大功能点,一个是数据层,一个是视图层. 数据服务层:通过它,可以实现表设计.领域层初始化.多语言.automapper自动注 ...

  7. ES6笔记(5)-- Generator生成器函数

    系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...

  8. JavaScript RegExp 基础详谈

    前言: 正则对于一个码农来说是最基础的了,而且在博客园中,发表关于讲解正则表达式的技术文章,更是数不胜数,各有各的优点,但是就是这种很基础的东西,如果我们不去真正仔细研究.学习.掌握,而是抱着需要的时 ...

  9. OData Client Code Generator

    转发. [Tutorial & Sample] How to use OData Client Code Generator to generate client-side proxy cla ...

随机推荐

  1. Sublime text3 配置c++环境 并设置快捷键

    VScode配c++环境太麻烦了 打算用sublime写C++ 记录一下配置过程因为我是有DEV环境的 直接将MINGW64加入环境变量即可 在DEV文件夹下的MinGW64\bin(就是有g++.e ...

  2. asp.net开源流程引擎API开发调用接口大全-工作流引擎设计

    关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流 一.程序调用开发接口二.   接口说明 所谓的驰骋工作流引擎的接口,在B ...

  3. 第一次 在Java课上的编程

    第一次在java课上的编程(使用参数输入求和): 代码: public class He {    public static void main(String[] args)    {       ...

  4. LeetCode_20-Valid Parentheses

    给定一个字符串,其中包含字符’(’,’)’,’[’,’]’,’{‘,’}’,左括号必须匹配右括号,一对匹配的括号不能单独出现单个左括号或者右括号.如:(()[])有效,[(])无效空字符串也算是有效的 ...

  5. 部署主从dns

    主机部署:yum安装DNS服务和依赖 [admin@haifly-bj-dns1 ~]$ sudo yum install bind-chroot启动named-chroot服务 [admin@hai ...

  6. tcpdump使用详情及案例

    转载http://starsliao.blog.163.com/blog/static/89048201062333032563/ TCPdump抓包命令tcpdump是一个用于截取网络分组,并输出分 ...

  7. python服务端工程师就业面试指导☝☝☝

    python服务端工程师就业面试指导 由Python专业面试官打造的课,少之又少,专业代表着经验,代表着对考察点的通透理解,更代表着对你负责 第1章 Python工程师offer直通车(视频+教辅文档 ...

  8. PhpSpreadsheet 导出特定格式 — 广告请款单

    需求说明 最近需要实现一个导出这种格式的Excel表单,之前都有用过导出Excel的功能,但大都是表头+数据的形式,只用于获取数据,没有太多样式要求,不用合并单元格.合并居中等,也不用对每一行数据特异 ...

  9. 构造函数语义学——Default Constructor篇

    构造函数语义学--Default Constructor 篇 这一章原书主要分析了:编译器关于对象构造过程的干涉,即在对象构造这个过程中,编译器到底在背后做了什么 这一章的重点在于 default c ...

  10. 详解立即执行函数(function(){}()),(function(){})()

    要知道这几种写法之间的区别,我们要先聊些题外话——js中函数的两种命名方式,即表达式和声明式. 函数的声明式写法为:function foo(){/*...*/},这种写法会导致函数提升,所有func ...