Generator 前言:

Genertor 函数是es6 新增的一种异步编程的解决方案,语法和传统的函数完全不同;Genertor 函数的最大的特点就是可以交出函数的执行权(即暂停执行)。

Generator 基本概念:

对于Generator 函数也可以叫做生成器函数,

  • 形式上: Generator函数是一个普通的函数,不过相对于普通函数多出了两个特征。一是在function关键字和函数明之间多了’*'号;二是函数内部使用了yield表达式,用于定义Generator函数中的每个状态。
  • 语法上: Generator函数封装了多个内部状态(通过yield表达式定义内部状态)。执行Generator函数时会返回一个遍历器对象(Iterator(迭代器)对象)。也就是说,Generator是遍历器对象生成函数,函数内部封装了多个状态。通过返回的Iterator对象,可以依次遍历(调用next方法)Generator函数的每个内部状态。
  • 调用上: 普通函数在调用之后会立即执行,而Generator函数调用之后不会立即执行,而是会返回遍历器对象(Iterator对象)。通过Iterator对象的next方法来遍历内部yield表达式定义的每一个状态。

Generator 方式使用:

function *myGenerator() {yield 'Hello'yield 'world'return 'ending'
}let MG = myGenerator()MG.next() // {value:'Hello',done:false}
MG.next() // {value:'world',done:false}
MG.next() // {value:'ending',done:true}
MG.next() // {value:'undefined',done:true}

上面代码一共调用了四次next方法。

第一次调用,Generator 函数开始执行,直到遇到第一个yield表达式为止。next方法返回一个对象,它的value属性就是当前yield表达式的值hello,done属性的值false,表示遍历还没有结束。

第二次调用,Generator 函数从上次yield表达式停下的地方,一直执行到下一个yield表达式。next方法返回的对象的value属性就是当前yield表达式的值world,done属性的值false,表示遍历还没有结束。

第三次调用,Generator 函数从上次yield表达式停下的地方,一直执行到return语句(如果没有return语句,就执行到函数结束)。next方法返回的对象的value属性,就是紧跟在return语句后面的表达式的值(如果没有return语句,则value属性的值为undefined),done属性的值true,表示遍历已经结束。

第四次调用,此时 Generator 函数已经运行完毕,next方法返回对象的value属性为undefined,done属性为true。以后再调用next方法,返回的都是这个值。

总结:

调用 Generator 函数,返回一个遍历器对象,代表 Generator 函数的内部指针。以后,每次调用遍历器对象的next方法,就会返回一个有着value和done两个属性的对象。value属性表示当前的内部状态的值,是yield表达式后面那个表达式的值;done属性是一个布尔值,表示是否遍历结束。

Generator 函数的详解:相关推荐

  1. ES6 generator函数的详解

    迭代器的基础用法 function* helloGenerator(){yield '我是next1'yield '我是next2'return 123 } let res = helloGenera ...

  2. JS中Generator函数的详解

    概念     Generator 函数是 ES6 提供的一种异步编程解决方案.它既是一个生成器,也是一个状态机,内部拥有值及相关的状态,生成器返回一个迭代器 Iterator 对象,我们可以通过这个迭 ...

  3. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  4. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

  5. R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表

    R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表

  6. R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

    R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

  7. R语言tidyr包separate()函数实战详解:一列裂变为多列

    R语言tidyr包separate()函数实战详解:一列裂变为多列 目录 R语言tidyr包separate()函数实战详解:一列裂变为多列 一列裂变为两列

  8. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  9. LayoutInflater的inflate函数用法详解

    LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...

最新文章

  1. 沙雕记(1) 之 Land Grab
  2. Centos7 下Redis3安装
  3. python filter
  4. 一文了解2020年中国液冷数据中心行业市场现状与发展前景分析市场规模有望破千亿...
  5. slam特征点深度 svd_SLAM初探:关于视觉SLAM的一些常识
  6. 大剑无锋之介绍一下B+树【面试推荐】
  7. b端 ux 设计思维_借助系统思维从视觉设计过渡到UX
  8. Windows与Linux下进程间通信技术比较
  9. precede和previous_Previous Analyses of Hungarian Phrase Structure
  10. neroLinux3.x的序列号
  11. python实现简易聊天需要登录_python编写简易聊天室实现局域网内聊天功能
  12. 3串锂电池电量检测ic bq2060pdf及应用原理图_接受电源IC需求挑战,轻松实现精确调节的电源电压!...
  13. 电脑数据恢复,哪种方法靠谱?
  14. Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序
  15. 利用Onionshare 共享匿名文件
  16. Sublime Text格式化SQL
  17. 【语义分割】 DRANet Scene Segmentation With Dual Relation-Aware Attention Network
  18. 【深度学习】常用数据集标注软件使用指南
  19. 正确建立索引以及最左前缀原则
  20. wireshark抓包获取好友ip,定位所在位置

热门文章

  1. 今天我们说个一直以来的有趣话题:男程序员都是秃头,女程序员满脸痘痘
  2. 四六级真题长难句分析与应用
  3. 2022-08-04 乐理知识(三) 如何打拍子——V字打拍法,三角形打拍法,常见节奏型:二八,四十六,前十六后八,前八后十六,前后附点,大附点,大小切分,八三拍的节奏型及其变体
  4. 面经手册 · 开篇《面试官都问我啥》
  5. ajax异步请求的代码,ajax 异步请求 代码
  6. python进行词频统计_如何利用Python进行文本词频统计
  7. 替代Windows文件服务器,windows文件服务器替代
  8. 大白话5分钟带你走进人工智能-神经网络之tensorflow的前世今生和DAG原理图解
  9. web前端:文本、字体、图像、列表 全【含精灵图,box-sizing,字符间距,首行缩进,垂直对齐】
  10. html5制作圆弧,1.2 绘制圆弧 - HTML5 Canvas 实战