携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天juejin.cn/post/712312…
Generator函数
Generator主要的作用,就是来封装异步的。是解决异步编程的一种方案。
它里面可以封装好多个异步任务(即封装了好多个状态),Promise只能封装一个。next()返回的对象,我们也可以称它为是一个状态。
Generator函数调用的返回值是一个遍历器对象,可通过遍历器对象的next()方法,把每一个异步结果拿出来。
什么是Generator简介:
Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。Generator 函数有多种理解角度。
语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。
形式上,Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。
执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。 yield有时是可以省略的
yield后面跟的就是一个值,也就是一个状态,return代表的是最后一个状态,不用return,也可以就用yield,但是用return和yield有不同的地方:用return在最后next()方法返回的对象直接是{values:undefined,done:true},而yield是{values:值,done:false},需要在调用一次next(),返回的才是{values:undefined,done:false}。
调用了Generator函数,什么也不会执行,而是生成遍历器对象(即一个指向内部状态的指针对象),这个对象里由next()方法,next()方法返回一个对象,对象里的value值是yield表达式后面的表达式结果的值。
fo...in遍历的时候只会遍历对象自身和继承的可枚举的属性。
与 Iterator 接口的关系
上一章说过,任意一个对象的Symbol.iterator方法,等于该对象的遍历器生成函数,调用该函数会返回该对象的一个遍历器对象。
由于 Generator 函数就是遍历器生成函数,因此可以把 Generator 赋值给对象的Symbol.iterator属性,从而使得该对象具有 Iterator 接口。
遍历器对象的next方法的运行逻辑如下。
(1)遇到yield表达式,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值。
(2)下一次调用next方法时,再继续往下执行,直到遇到下一个yield表达式。
(3)如果没有再遇到新的yield表达式,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值。
(4)如果该函数没有return语句,则返回的对象的value属性值为undefined。
需要注意的是,yield表达式后面的表达式,只有当调用next方法、内部指针指向该语句时才会执行,因此等于为 JavaScript 提供了手动的“惰性求值”。