Generator [ˈdʒenəreɪtə(r)] 函数结构
Generator函数是ES6新增的一种异步编程方案。
说明:Generator函数指的是一种新的语法结构,是一个遍历器对象生成器,它内部可以封装多个状态,非常适合用于异步操作。
Generator函数语法和普通的 function 函数类似,但有三个不同点:
(1)function 关键字和函数名称之间有一个星号(*)
(2)函数体内可以使用 yield [ji:ld] 语句
(3)函数调用后不会立即执行,返回的是一个遍历器对象
//一个Generator函数
function* show() {
yield '百度网'
yield '深圳'
yield 'www.baidu.com'
return 'end'
}
//函数内部使用yield语法定义不同的状态,return 也可以定义一个状态,也就是说上面代码有四个状态
var y = show() // 调用此函数,并不会立即执行它其中的代码,而是返回一个遍历器对象
console.log(y.next()) // 返回一个具有value和done属性的对象
console.log(y.next()) // 有return,返回(value:end,done:true); 如果没有return, 返回(value:undefined,done:true)
yield 语法:
每一个yield语句定义不同的状态,它也是一个代码执行暂停标识。
yield语句不能在普通函数中使用,否则会报错。
调用Generator 函数可以返回一个遍历器,要想访问Generator函数中的每一个状态,需要使用遍历器对象调用next()方法
如果yield语句作为其他语句的一部分,那么必须使用小括号包裹,否则会报错
function *baidu () {
// console.log("欢迎来到" + yield "百度网") // 报错
console.log("欢迎来到" + (yield "百度网")) // 正确
}
let y = baidu()
console.log(y.next().value) // 先返回 yield
console.log(y.next().value) // 再返回 return,yield为undefined
next()方法:
next()一个主要功能,就是从暂停状态继续下一段代码的执行。
next()还有一个重要的功能,那就是可以接受一个参数,此参数作为上一个yield语句的返回值
虽然当代码执行到yield语句的时候,能够将其后面的表达式的值作为对象的value属性值,但是默认情况下yield语句是没有返回值的,或者说它的返回值是undefined
function *show() {
let x = yield "你好" // 默认无返回值
console.log(x) // 输出undefined
}
var y = show()
y.next()
y.next()
注意:yield 语句的返回值和yield后面表达式的返回值是两个概念
向next中传值,注: 此值作为上一个yield的返回值
function* count (num) {
let x = 2*(yield num)
console.log('x = ' + x)
let y = yield x*3
console.log('y = ' + y)
console.log(x,y)
}
var g = count(5)
console.log(g.next()) // {value:5,done:false},第1个next传值无意义,因为没有上一个yield
// console.log(g.next()) // x = NaN {value:NaN,done:false}
console.log(g.next(3)) // {value:18,done:false}
console.log(g.next(3)) // {value:undefined,done:true}
注:可以通过next 进行传值,是上一个表达式中yield 的 赋值
//---------------- 异步方法实例 -------------------
setTimeout(function(){
console.log('hello')
},3000)
let y;
var func = function(){
setTimeout(function(time){
console.log(time,'on')
y.next(true)
},time)
}
var gen = function * () {
var f1 = yield func(3000)
console.log('f1:', f1)
var f2 = yield func(1000)
console.log('f2:', f2)
}
y = gen()
y.next()
console.log('end')
.
Generator [ˈdʒenəreɪtə(r)] 函数结构的更多相关文章
- ffplay.c函数结构简单分析(画图)
最近重温了一下FFplay的源代码.FFplay是FFmpeg项目提供的播放器示例.尽管FFplay只是一个简单的播放器示例,它的源代码的量也是不少的.之前看代码,主要是集中于某一个"点&q ...
- 选择、循环与函数结构:MATLAB VS Python
选择.循环与函数结构:MATLAB VS Python 整理基本的程序控制结构,主要是选择 和 循环. 1.MATLAB选择结构 (1)单分支if语句格式: if 条件 语句组 end (2)双分支i ...
- ffplay.c函数结构简单分析(绘图)
近期重温了一下FFplay的源码. FFplay是FFmpeg项目提供的播放器演示样例.虽然FFplay不过一个简单的播放器演示样例,它的源码的量也是不少的. 之前看代码,主要是集中于某一个" ...
- r函数知识总结
1. rbind(), cbind(): 构造.合并vector 或matrix为一个矩阵:cbind(1, 1:10) ----默认列合并, rbind(1, 1:10) ----行合并(or构造 ...
- ffmpeg.c函数结构简单分析(画图)
前一阵子研究转码的时候看了FFmpeg的源代码.由于ffmpeg.c的代码相对比较长,而且其中有相当一部分是AVFilter有关的代码(这一部分一直不太熟),因此之前学习FFmpeg的时候一直也没有好 ...
- C语言 ---- 函数 结构体 iOS学习-----细碎知识点总结
函数的定义 返回值类型 函数名(形式参数列表) { 函数的实现 } 函数不允许嵌套定义 如果函数的定义在主调函数之后,那么要进行提前声明才能使用. // 匿名结构体,结构 ...
- Java 下一代: 函数式编码风格——Groovy、Scala 和 Clojure 共享的函数结构及其优势
原文地址 本文内容 命令式处理 函数式处理 函数式编程的优势 所有 Java 下一代语言都包括函数式编程结构,让您可以从一个更高的抽象层面来思考问题.然而,语言间术语的不同使得难以看到类似的结构.本期 ...
- 关于在C++中调用R函数以及RCpp使用
最近因为项目要用到,所以在想办法把R语言用到C++中. 网上查了看到有一个Rcpp的工具.所以在这里总结一下. 现在能想到的几种在C++中调用R语言的方法如下: 1. 使用Rcpp R高级编程技巧及R ...
- 字符串输出输入函数,const修饰符,内存分区,动态内存管理,指针和函数,结构体
1.字符串输出输入函数 读入字符串的方法: 1) scanf 特点:不能接收空格 2) gets 特点:可以接受含有空格的字符串 ,不安全 3) fgets(); 特点:可以帮我们自动根据数组的长度截 ...
随机推荐
- [SDOI2015]约数个数和 --- 简单反演
求\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}d(ij)\) 不知道怎么讲..... 首先考虑\(d(ij)\)究竟是什么 首先,很自然地想到,既然是求\( ...
- [BZOJ2402]陶陶的难题II(树链剖分+线段树维护凸包+分数规划)
陶陶的难题II 时间限制:40s 空间限制:128MB 题目描述 输入格式 第一行包含一个正整数N,表示树中结点的个数. 第二行包含N个正实数,第i个数表示xi (1<=xi<= ...
- 【递推】hdu5927 Auxiliary Set
题意:给你一棵树.q次询问,每次给你一些非关键点,其他的点都是关键点,让你输出树中既不是关键点,也不是关键点的lca的点的数量. 对每次询问的非关键点按照深度从深到浅排序,依次处理,最开始每个点受到的 ...
- Java Queue的测试
上传图片没上去,提交的时候已经结束 代码链接
- [CC-CHEFGRPH]Time to Study Graphs with Chef
[CC-CHEFGRPH]Time to Study Graphs with Chef 题目大意: 一个有向图可以分成\(n+2(n\le10^{12})\)层,第\(0\)层和第\(n+1\)层有\ ...
- django之cookie、session和ajax
1 Cookie cookie是什么? 保存在客户端浏览器上的键值对 {k:v} cookie依附在请求头或响应头中出现 发送请求时,会自动携带自己网站的cookie 应用: 实现登录 投票 1. ...
- ZOJ 3213 Beautiful Meadow 简单路径 插头DP
简单路径的题目,其实就是在状态后面多记了有多少个独立插头. 分类讨论独立插头: 1.只存在上插头或者左插头,可以选择作为独立插头. 2.都不存在上插头和左插头,选择作为独立插头的同时要标号为新的连通块 ...
- 机器学习中的 precision、recall、accuracy、F1 Score
1. 四个概念定义:TP.FP.TN.FN 先看四个概念定义: - TP,True Positive - FP,False Positive - TN,True Negative - FN,False ...
- UIColor和 同 CIColor 与 CGColor 之间的联系、转换
1. 利用UIColor展现 #F6F6F6 这个传统的颜色 #F6F6F6 为一个 16 进制表示的RPG颜色,所以,需要先转换成 10进制,其中 F6 - 240,F6 - 240 ,F6 - ...
- Windows UWP开发系列 – RelativePanel
RelativePanel是在Windows 10 UWP程序中引入的一种新的布局面板,它是通过附加属性设置元素间的位置关系来对实现布局的.一个简单的示例如下: <RelativePanel&g ...