Generator 对象(理解为生成器函数更好)

  • 注意,Generator函数,不可当作构造函数
  • 首先声明一个Generator 函数,以下均以 gen 为例
function* gen(){yield "first";yield "second";yield "third";
}
var res = gen();
  • 它是一个高阶函数(gen),可以生成一个可迭代的函数(res)
  • 生成的函数(res),是一个惰性函数,每次迭代都重写自身
  • 惰性函数(res)有一个next方法,可以执行链式调用

function*语法糖

  • 它以这种方式,规定了Generator继承自GeneratorFunction
  • 如下,可以看到,gen的构造器属性为GeneratorFunction
  • 不出意外,GeneratorFunction的构造器属性则是Function
gen.constructor;//ƒ GeneratorFunction() { [native code] };
gen.constructor.constructor;//ƒ Function() { [native code] };

GeneratorFunction构造器

  • Generator 生成器函数是 GeneratorFunction 的实例对象
  • GeneratorFunction.constructor的初始值是 GeneratorFunction,且不可被修改
  • 但是,GeneratorFunction并不是一个全局对象。获取比较麻烦一点
Object.getPrototypeOf(function*(){}).constructor

用GeneratorFunction构造函数创建一个生成器函数

  • 需要显示调用 new 。最后一个参数为函数体,之前的都为函数的参数(注意均为字符串形式)
var GeneratorFunction = Object.getPrototypeOf(function*(){}).constructor
var gen = new GeneratorFunction("a","b", "yield a * b");
var iterator = gen(10,20);
console.log(iterator.next().value); // 200

Generator 对象(函数)的方法

  • next,是一个迭代器方法
  • 分析可知,next方法是 GeneratorFunction 对象的原型方法
gen.constructor.prototype
//GeneratorFunction{prototype: Generator, constructor: ƒ, Symbol(Symbol.toStringTag): "GeneratorFunction"}
gen.constructor.prototype.prototype.next
//ƒ next() { [native code] }
  • return,结束迭代并且返回一个vaule值
console.log(res.next());//{ "value": "first", "done": false }
console.log(res.return("444"));//{ "value": "444", "done": true }
console.log(res.next());//{ "done": true },此时已经没有value值了
  • throw,异常抛出,内部通过 try…catch 块进行捕获
gen.throw(new Error("Something went wrong"));

向 Generator 传递数据和传递参数

//传递数据
function* gem_1(){let color = yield;let name = yield;console.log(color,name);
}
const iterator_1 = gem_1();
console.log(iterator_1.next());//{ "done": false }
console.log(iterator_1.next("red"));//{ "done": false }
console.log(iterator_1.next("gs"));//red gs { "done": true }
//传递参数
function* gem_2(color,name){yield color;yield name;
}
const iterator_2 = gem_2("green","zk");
console.log(iterator_2.next());//{ "value": "green", "done": false }
console.log(iterator_2.next());//{ "value": "zk", "done": false }
console.log(iterator_2.next());//{ "done": true }

最终实现异步回调的同步处理

let iterator;//注意先声明iteratorconst iterOne = () => {setTimeout(function() {iterator.next(111);}, 1000);
}
const iterTwo = () => {setTimeout(function() {iterator.next(222);}, 3000);
}function* gen(){const one = yield iterOne();const two = yield iterTwo();console.log(one*2 + two);
}iterator = gen();
iterator.next();//444

理解Generator生成器对象相关推荐

  1. 完全理解Python迭代对象、迭代器、生成器

    本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...

  2. 完全理解 Python 迭代对象、迭代器、生成器(转)

    完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...

  3. 完全理解python迭代对象_完全理解Python迭代对象、迭代器、生成器

    1.assert:python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触 ...

  4. 深入理解Python生成器(Generator)

    我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多 ...

  5. python数据采集仪_数据采集卡支持python么深入理解Python生成器(Generator)

    我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多 ...

  6. 生成器对象(Generator)

    生成器对象(Generator )是由一个 generator function 返回的,它同时符合可迭代协议和迭代器协议. 语法 function* gen() { yield 1;yield 2; ...

  7. 彻底理解 Python 生成器

    原文链接:https://www.cnblogs.com/liangmingshen/p/9706181.html 1. 生成器定义 在Python中,一边循环一边计算的机制,称为生成器:genera ...

  8. 如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...

    2019-06-16 深入理解可迭代对象.迭代器 什么是迭代器模式? 当扫描内存中放不下的数据集时,要找到惰性获取数据项的方式,即按需一次获取一个数据项,这就是迭代器模式 迭代器构成? python没 ...

  9. python生成器yield原理_Python generator生成器和yield表达式详解

    前言 Python生成器(generator)并不是一个晦涩难懂的概念.相比于MetaClass和Closure等概念,其较为容易理解和掌握.但相对于程序结构:顺序.循环和分支而言其又不是特别的直观. ...

最新文章

  1. 算法的时间与空间复杂度详解
  2. 【转载】C#中StreamReader读取中文文本出现乱码的解决方法
  3. edge浏览器什么相当于ie的中低_Microsoft Edge浏览器
  4. python核心,内建函数,高阶函数
  5. linux的常用操作——用户的添加、删除和查看
  6. 深入理解Java main方法
  7. C++ new和malloc区别
  8. 【暴力】LeetCode 300. Longest Increasing Subsequence
  9. Spring中的循环依赖(单例)
  10. 专家系统的产生和发展
  11. 服务器电脑可以显示移动硬盘,笔记本电脑插移动硬盘为什么显示拒绝访问无法访问?
  12. Java支付宝第三方登陆开发过程
  13. 软件测试中的“银行企业银行对公渠道转账和财务查询和银企对账项目”
  14. C# Excel 条件格式
  15. 内外兼修 华润啤酒的“有为”哲学
  16. 亿道信息丨12.2英寸加固平板丨三防平板丨工业平板丨货物追踪好助手
  17. 【详细!!】计算机类书籍整理
  18. 控制用计算机论文,计算机在自动控制技术实践中的应用分析论文原稿
  19. js event属性
  20. 巴菲特卸任后盖茨梅琳达与四位新理事共管盖茨基金会;Club Med中国第三家冰雪度假村开业 | 美通社头条...

热门文章

  1. Python基础学习3——列表
  2. 深入理解Java虚拟机(二)Java内存区域与内存溢出异常
  3. Bootstrapping sample
  4. 二级路由器的设置(品牌:小米和TPLINK)
  5. Visual Box磁盘空间不足问题解决,好开心~
  6. SQL中的ALL,ANY,SOME的用法
  7. Socket.io部署遇到的坑
  8. 创新模式探索:化妆品B2B电商系统迎来新机遇
  9. 男女都走不出的27岁定律!
  10. dubbo的group分组