概念: | |
1、ES6提供的解决异步编程的方案之一 | |
2、Generator函数是一个状态机,内部封装了不同状态的数据, | |
3、用来生成遍历器对象 | |
4、可暂停函数(惰性求值), yield可暂停,next方法可启动。每次返回的是yield后的表达式结果 | |
特点: | |
1、function 与函数名之间有一个星号(*) | |
2、内部用yield表达式来定义不同的状态 | |
例如: | |
function* generatorExample(){ | |
let result = yield 'hello'; // 状态值为hello | |
yield 'generator'; // 状态值为generator | |
} | |
3、generator函数返回的是对象(接iterat指针对or),而不会执行函数内部逻辑 | |
4、调用next方法函数内部逻辑开始执行,遇到yield表达式停止,返回{value: yield后的表达式结果/undefined, done: false/true} | |
5、再次调用next方法会从上一次停止时的yield处开始,直到最后 | |
6、yield语句返回结果通常为undefined, 当调用next方法时传参内容会作为启动时yield语句的返回值。 |
1- generator是什么?一个函数状态机,es6提供的异步编程解决方案之一内部包含各种状态 | |
2- generator 与普通函数是不同,使用yield定义多种状态 | |
3- 调用generator函数 返回一个迭代器对象 | |
yield* 表达式
如果在 Generator 函数里面调用另一个 Generator 函数,默认情况下是没有效果的
使用 for…of来遍历函数gen_two的生成的遍历器对象时,只返回了gen_two自身的两个状态值。此时,如果想要正确的在gen_two里调用gen,就需要用到 yield* 表达式
next()方法
表示上一个yield表达式的返回值,所以在第一次使用next方法时,传递参数是无效的。V8 引擎直接忽略第一次使用next方法时的参数,只有从第二次使用next方法开始,参数才是有效的。从语义上讲,第一个next方法用来启动遍历器对象,所以不用带有参数。
for…of循环
可以自动遍历 Generator 函数时生成的Iterator对象,且此时不再需要调用next方法。一旦next方法的返回对象的done属性为true,for…of循环就会中止,且不包含该返回对象。
与 Iterator 接口的关系
ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。由于执行 Generator 函数实际返回的是一个遍历器,因此可以把 Generator 赋值给对象的Symbol.iterator属性,从而使得该对象具有 Iterator 接口。