TypeScript入门教程 之 生成器函数

生成器函数

function *是用于创建生成器函数的语法。调用generator函数将返回一个generator对象。发电机对象如下刚刚所述迭代器接口(即nextreturnthrow函数)。

生成器功能背后有两个主要动机:

延迟迭代器

生成器函数可用于创建延迟迭代器,例如,以下函数根据需要返回无限的整数列表:

function* infiniteSequence() {var i = 0;while(true) {yield i++;}
}var iterator = infiniteSequence();
while (true) {console.log(iterator.next()); // { value: xxxx, done: false } forever and ever
}

当然,如果迭代器确实结束了,您将得到{ done: true }如下所示的结果:

function* idMaker(){let index = 0;while(index < 3)yield index++;
}let gen = idMaker();console.log(gen.next()); // { value: 0, done: false }
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { done: true }

外部控制执行

这是发电机真正令人兴奋的部分。它本质上允许函数暂停其执行,并将其余函数执行的控制权(命运)传递给调用者。

生成器函数在调用时不会执行。它只是创建一个生成器对象。考虑以下示例以及示例执行:

function* generator(){console.log('Execution started');yield 0;console.log('Execution resumed');yield 1;console.log('Execution resumed');
}var iterator = generator();
console.log('Starting iteration'); // This will execute before anything in the generator function body executes
console.log(iterator.next()); // { value: 0, done: false }
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

如果运行此命令,将得到以下输出:

$ node outside.js
Starting iteration
Execution started
{ value: 0, done: false }
Execution resumed
{ value: 1, done: false }
Execution resumed
{ value: undefined, done: true }
  • 该函数仅next在生成器对象上被调用一次才开始执行。
  • 一旦遇到语句,该函数就会暂停yield
  • 该函数在被调用时恢复next

因此,基本上生成器功能的执行可由生成器对象控制。

我们使用生成器进行通信主要是一种方法,其中生成器返回迭代器的值。JavaScript生成器的一个极其强大的功能是它们允许双向通信(带有警告)。

  • 您可以使用以下方法控制yield表达式的结果值iterator.next(valueToInject)
  • 您可以yield使用以下方式在表达式的位置抛出异常iterator.throw(error)

以下示例演示iterator.next(valueToInject)

function* generator() {const bar = yield 'foo'; // bar may be *any* typeconsole.log(bar); // bar!
}const iterator = generator();
// Start execution till we get first yield value
const foo = iterator.next();
console.log(foo.value); // foo
// Resume execution injecting bar
const nextThing = iterator.next('bar');

由于yield返回传递给迭代nextnext函数的参数,并且所有迭代器的函数都接受任何类型的参数,因此TypeScript将始终将any类型分配给yield运算符的结果(bar如上)。

您可以自行将结果强制为所需的类型,并确保仅将该类型的值传递给下一个类型(例如,通过搭建一个额外的要求next您的类型强制层)。如果强类型对于您可能希望完全避免双向通信,以及完全依赖它的软件包(例如redux-saga)。

以下示例演示iterator.throw(error)

function* generator() {try {yield 'foo';}catch(err) {console.log(err.message); // bar!}
}var iterator = generator();
// Start execution till we get first yield value
var foo = iterator.next();
console.log(foo.value); // foo
// Resume execution throwing an exception 'bar'
var nextThing = iterator.throw(new Error('bar'));

因此,这里是摘要:

  • yield 允许生成器功能暂停其通信并将控制权传递给外部系统
  • 外部系统可以将值推入生成器功能主体
  • 外部系统可以在生成器函数体中引发异常

这有什么用?跳转到下一部分异步/等待并查找。

翻译来源:https://gitee.com/yunwisdoms/typescript-book/blob/master/docs/generators.md

TypeScript入门教程 之 生成器函数相关推荐

  1. TypeScript入门教程 之 箭头函数

    TypeScript入门教程 之 箭头函数 亲切地称为粗箭头(因为->是细箭头并且=>是粗箭头),也被称为lambda函数(由于其他语言).另一个常用功能是胖箭头功能()=>some ...

  2. TypeScript入门教程 之 classes-emit

    TypeScript入门教程 之 classes-emit What's up with the IIFE 为该类生成的js可能是: function Point(x, y) {this.x = x; ...

  3. TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter

    TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter 将JavaScript中的类作为头等项很重要的原因是: 类提供了有用的结构抽象 为开发人员提供一种一致的方式来使用类, ...

  4. TypeScript入门教程 之 Let 关键字

    TypeScript入门教程 之 Let 关键字 let varJavaScript中的变量是函数范围的.这不同于许多其他语言(C#/ Java等),其中变量是块作用域的.如果将块作用域的思维方式带入 ...

  5. TypeScript入门教程 之 Promise

    TypeScript入门教程 之 Promise Promise 在Promise类的东西,存在于许多现代的JavaScript引擎,并可以很容易地polyfilled.承诺的主要动机是将同步样式错误 ...

  6. TypeScript入门教程 之 点差算子/散布运算符/...运算符/剩余参数/...参数

    TypeScript入门教程 之 点差算子/散布运算符/...运算符/剩余参数/...参数 点差算子/散布运算符 散布运算符的主要目标是散布数组或对象的元素.最好用示例说明. 应用 一个常见的用例是将 ...

  7. TypeScript入门教程 之 模板字符串

    TypeScript入门教程 之 模板字符串 模板文字(模板字符串) 从语法上讲,这些是使用反引号(即`)而不是单引号(')或双引号(")引号的字符串.Template Literals的动 ...

  8. 超详细的TypeScript入门教程!

    在看这篇文章之前,我是强烈推荐TypeScript 入门教程这本书的.因为这本书它是:从 JavaScript 程序员的角度总结思考,循序渐进的理解TypeScript.文章来源也是该书,但听我一句话 ...

  9. TypeScript 入门教程

    TypeScript 入门教程 分类 编程技术 什么是 TypeScript? TypeScript 是一种由微软开发的自由和开源的编程语言,它是JavaScript的一个超集,扩展了JavaScri ...

最新文章

  1. 《C#图解教程》读书笔记之四:类和继承
  2. depot用例视图建模
  3. 【每周CV论文推荐】 初学目标检测必须要读的文章
  4. linux时间字符串转正常时间
  5. mybatis-启动源码分析
  6. 扫地机器人哪个品牌好?五款口碑最好的扫地机器人
  7. 1*2*...*1000的末尾有多少个0?(Java实现)
  8. Selenium WebDriver API
  9. Java 生成随机中文、英文姓名(上)
  10. PYMOL-note
  11. android ios 微信 备份通讯录备份通讯录备份通讯录,苹果手机怎么备份通讯录?手机通讯录微信联系人备份教程...
  12. StoryBoard故事版之ViewController与实体类的关联和不同StoryBoard 跳转
  13. css3自学教学,css3精通学习教程(全).pdf
  14. python程序设计 从基础入门到实战应用电子书_Python程序设计——从基础入门到实战应用...
  15. python数据分析实战之异常值处理
  16. Linux挂载群晖NFS共享文件夹
  17. 学习Java第二十四天
  18. python数据可视化库_python和r中用于数据可视化的前9个库
  19. 微信新BUG曝光:好友偷偷删了你,这样就能查出来
  20. Pandas 11-综合练习

热门文章

  1. sql2005 安装完成后只有配置工具,没有管理工具和性能分析工具
  2. 接口定义【领域对象】
  3. jquery 键盘事件
  4. 重置 MySQL 自增列id(不删除原数据)
  5. 【linux】 rm 防止误删
  6. javascript 西瓜一期 13 十六进制的数数方式与进位
  7. css3 2D动画效果 200303
  8. 石头剪刀布小游戏开发的需求说明
  9. django-单表的增删改查-用户部门表
  10. 爬虫-04-常见的请求头