持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
1.概念
Generator 函数是 ES6 提供的一种异步编程解决方案。
形式上与普通函数的区别,一是,function关键字与函数名之间有一个星号( * );二是,函数体内部使用yield表达式,用来定义函数内部的状态。
1.语法
function* gen() {
yield 1;
yield 2;
yield 3;
}
let g = gen();
// "Generator { }"
2.例子
执行机制:
在函数名后面加上()即可执行,但是 Generator 函数不会像普通函数一样立即执行,返回一个遍历器对象,代表返回一个指向内部状态对象的指针,以后,每次调用遍历器对象Iterator 的next方法,指针就会从函数头部或者上一次停下来的地方开始执行,同时会返回一个有着value和done两个属性的对象。
let f = func();
第一次调用 next 方法时,从 Generator 函数的头部开始执行,先是打印了 one ,执行到 yield 就停下来,并将yield 后边表达式的值 '1',作为返回对象的 value 属性值,此时函数还没有执行完, 返回对象的 done 属性值是 false。
第二次调用 next 方法时,同上步 。
第三次调用 next 方法时,先是打印了 three ,然后执行了函数的返回操作,并将 return 后面的表达式的值,作为返回对象的 value 属性值,此时函数已经结束,多以 done 属性值为true 。
第四次调用 next 方法时, 此时函数已经执行完了,所以返回 value 属性值是 undefined ,done 属性值是 true 。如果执行第三步时,没有 return 语句的话,就直接返{value: undefined, done: true}。
next方法
一般情况下,next 方法不传入参数的时候,yield 表达式的返回值是 undefined 。当 next 传入参数的时候,该参数会作为上一步yield的返回值。
除了使用 next ,for... of 循环,扩展运算符(...)、解构赋值和Array.from方法内部调用的,都是遍历器接口,都可用于遍历 Generator 函数生产的 Iterator 对象。
return方法
return 方法返回给定值,并结束遍历 Generator 函数。
return 方法提供参数时,返回该参数;不提供参数时,返回 undefined 。
yield* 表达式
yield* 表达式表示 yield 返回一个遍历器对象,用于在 Generator 函数内部,调用另一个 Generator 函数。