详谈Generator
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的更多相关文章
- EasyMesh - A Two-Dimensional Quality Mesh Generator
		EasyMesh - A Two-Dimensional Quality Mesh Generator eryar@163.com Abstract. EasyMesh is developed by ... 
- 轻量级“集合”迭代器-Generator
		Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ... 
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
		去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ... 
- 深入解析js异步编程利器Generator
		我们在编写Nodejs程序时,经常会用到回调函数,在一个操作执行完成之后对返回的数据进行处理,我简单的理解它为异步编程. 如果操作很多,那么回调的嵌套就会必不可少,那么如果操作非常多,那么回调的嵌套就 ... 
- mybatis Generator生成代码及使用方式
		本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5889312.html 为什么要有mybatis mybatis 是一个 Java 的 ORM 框架,OR ... 
- ABP配套代码生成器(ABP Code Generator)帮助文档,实现快速开发
		ABP代码生成器介绍 针对abp这个框架做了一个代码生成器,功能强大.分为两大功能点,一个是数据层,一个是视图层. 数据服务层:通过它,可以实现表设计.领域层初始化.多语言.automapper自动注 ... 
- ES6笔记(5)-- Generator生成器函数
		系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ... 
- JavaScript RegExp 基础详谈
		前言: 正则对于一个码农来说是最基础的了,而且在博客园中,发表关于讲解正则表达式的技术文章,更是数不胜数,各有各的优点,但是就是这种很基础的东西,如果我们不去真正仔细研究.学习.掌握,而是抱着需要的时 ... 
- OData Client Code Generator
		转发. [Tutorial & Sample] How to use OData Client Code Generator to generate client-side proxy cla ... 
随机推荐
- 【linux】Tomcat 安装
			登录linux后,切换目录到 /usr/local cd /user/local 在/usr/local目录新建文件夹servers用于存放tomcat文件 mkdir servers 在文件夹ser ... 
- Windows中利用共享内存来实现不同进程间的通信
			Windows中利用共享内存来实现不同进程间的通信 一.msdn详细介绍 https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-f ... 
- 【TencentOS tiny】 超详细的TencentOS tiny移植到STM32F103全教程
			移植前的准备工作 1. 获取STM32的裸机工程模板 STM32的裸机工程模板直接使用野火STM32开发板配套的固件库例程即可.可以从我github上获取https://github.com/jiej ... 
- RF页面断言
			title should be(断言title与预期指定的title内容相等): should be equal (断言某个字符串与预期指定的字符串相等) should not be equal ( ... 
- ASP.NET Core API ——Dapper的使用
			ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l 创建一个IDBConnection的接口对象 l 编 ... 
- PHP  array_udiff_uassoc
			1.函数的参数:返回数组的差集.用定义的函数比较键值和值. 2.函数的参数: @params array $array @params array $array1 ... @params callab ... 
- [BZOJ3813] 奇数国 - 线段树
			3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 912 Solved: 508[Submit][Status][Discuss] ... 
- Java自动化测试框架-04 - TestNG之Test Method篇 - 道法自然,法力无边(详细教程)
			简介 按照上一篇的计划,这一篇给小伙伴们分享一下测试方法. 一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递 ... 
- [系列] go-gin-api 路由中间件 - 签名验证(七)
			目录 概览 MD5 组合 AES 对称加密 RSA 非对称加密 如何调用? 性能测试 PHP 与 Go 加密方法如何互通? 源码地址 go-gin-api 系列文章 概览 首先同步下项目概况: 上篇文 ... 
- abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理六(二十四)
			abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ... 
