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)] 函数结构的更多相关文章

  1. ffplay.c函数结构简单分析(画图)

    最近重温了一下FFplay的源代码.FFplay是FFmpeg项目提供的播放器示例.尽管FFplay只是一个简单的播放器示例,它的源代码的量也是不少的.之前看代码,主要是集中于某一个"点&q ...

  2. 选择、循环与函数结构:MATLAB VS Python

    选择.循环与函数结构:MATLAB VS Python 整理基本的程序控制结构,主要是选择 和 循环. 1.MATLAB选择结构 (1)单分支if语句格式: if 条件 语句组 end (2)双分支i ...

  3. ffplay.c函数结构简单分析(绘图)

    近期重温了一下FFplay的源码. FFplay是FFmpeg项目提供的播放器演示样例.虽然FFplay不过一个简单的播放器演示样例,它的源码的量也是不少的. 之前看代码,主要是集中于某一个" ...

  4. r函数知识总结

    1. rbind(), cbind():  构造.合并vector 或matrix为一个矩阵:cbind(1, 1:10) ----默认列合并, rbind(1, 1:10) ----行合并(or构造 ...

  5. ffmpeg.c函数结构简单分析(画图)

    前一阵子研究转码的时候看了FFmpeg的源代码.由于ffmpeg.c的代码相对比较长,而且其中有相当一部分是AVFilter有关的代码(这一部分一直不太熟),因此之前学习FFmpeg的时候一直也没有好 ...

  6. C语言 ---- 函数 结构体 iOS学习-----细碎知识点总结

    函数的定义     返回值类型 函数名(形式参数列表) {        函数的实现     } 函数不允许嵌套定义 如果函数的定义在主调函数之后,那么要进行提前声明才能使用. // 匿名结构体,结构 ...

  7. Java 下一代: 函数式编码风格——Groovy、Scala 和 Clojure 共享的函数结构及其优势

    原文地址 本文内容 命令式处理 函数式处理 函数式编程的优势 所有 Java 下一代语言都包括函数式编程结构,让您可以从一个更高的抽象层面来思考问题.然而,语言间术语的不同使得难以看到类似的结构.本期 ...

  8. 关于在C++中调用R函数以及RCpp使用

    最近因为项目要用到,所以在想办法把R语言用到C++中. 网上查了看到有一个Rcpp的工具.所以在这里总结一下. 现在能想到的几种在C++中调用R语言的方法如下: 1. 使用Rcpp R高级编程技巧及R ...

  9. 字符串输出输入函数,const修饰符,内存分区,动态内存管理,指针和函数,结构体

    1.字符串输出输入函数 读入字符串的方法: 1) scanf 特点:不能接收空格 2) gets 特点:可以接受含有空格的字符串 ,不安全 3) fgets(); 特点:可以帮我们自动根据数组的长度截 ...

随机推荐

  1. POJ2185 Milking Grid KMP两次(二维KMP)较难

    http://poj.org/problem?id=2185   大概算是我学KMP简单题以来最废脑子的KMP题目了 , 当然细节并不是那么多 , 还是码起来很舒服的 , 题目中描写的平铺是那种瓷砖一 ...

  2. 【概率】【找规律】hdu6229 Wandering Robots

    题意:一个机器人在正方形迷宫的左上角,迷宫里有些格子有障碍物,每一步机器人会等概率地向能走的格子转移(包含自身).问你无限长的时间之后,机器人处于矩形对角线的右下方的概率. 无限长时间意味着,起点没有 ...

  3. poj 1733 并查集+hashmap

    题意:题目:有一个长度 已知的01串,给出多个条件,[l,r]这个区间中1的个数是奇数还是偶数,问前几个是正确的,没有矛盾 链接:点我 解题思路:hash离散化+并查集 首先我们不考虑离散化:s[x] ...

  4. uoj117 欧拉回路

    题目描述: 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50 分) 这张图是有向图.(50 分) 输入格式 ...

  5. ThinkPHP -- 去除URL中的index.php

    原路径是 http://localhost/test/index.php/index/add 想获得的地址是 http://localhost/test/index/add 那么如何去掉index.p ...

  6. ES6 Javascript 实用开发技巧

    ES6 实用开发技巧 定义变量/常量 ES6 中新增加了 let 和 const 两个命令,let 用于定义变量,const 用于定义常量 两个命令与原有的 var 命令所不同的地方在于,let, c ...

  7. Circuit translates I2C voltages

    This Design Idea explores level-shifting an I2C bus from 5V/ground (positive domain) to ground/–5V ( ...

  8. FPGA LVDS I/O as an Analog Programmable Comparator

    http://www.eetimes.com/author.asp?section_id=36&doc_id=1320289 Seeing the new ADC IP being bandi ...

  9. Papilio Pro Boards

    http://papilio.cc/index.php?n=Papilio.PapilioOne The Papilio is an Open Source FPGA development boar ...

  10. Using TXMLDocument, Working with XML Nodes

    Using TXMLDocument The starting point for working with an XML document is the Xml.XMLDoc.TXMLDocumen ...