生成器 generator

144 阅读2分钟

generator

生成器:由构造函数 Generator 创建的对象,该对象既是一个 迭代器,又是一个可以迭代的对象(满足可迭代协议)

var generator = new Generator()
    generator.next() 它具有 next方法
var iterator = generator[Symbol.iterator] // 可迭代对象

for(const item of generator) {
    // 由于是一个可迭代对象,因此也可以使用for of 循环
}

** 注意: Generator构造函数 不提供给开发者使用,仅作为JS引擎内部使用**

generator function

生成器创建函数, 在ES6 里可以在普通函数 function后加一个 *,使其变成生成器函数。

function* createGenerator() {
    console.log("开始运行")
    let result = yield 1;
    console.log("yield 运行了1 ", result)
    let result2 = yield 2;
    console.log('yield 运行了2 ', result1)
    return '结束'
}
const generator = createGenerator();
const result1 = generator.next(11);
console.log(result1) // {value: 1, done: false}
const result2 = generator.next(22);
console.log(result2) // {value: 2, done: false}
在函数内部 打印 //"yield 运行了1 ", 22

当调用 createGenerator(),函数体不会立即执行,函数体的执行权,交给返回出来的生成器来控制,需要执行函数体,必须通过 迭代器调用next()方法

  • 生成器函数的特点: 1、调用生成器函数,会返回一个生成器,而不是执行函数体(生成器函数体的执行,受到生成器控制)

2、每当调用了next() 方法,生成器的函数体从上一次的 yield的位置(或开始位置)运行到下一个 yield停止。

1. yield 关键字只能指生成器内部使用,不可以在普通函数内部使用
2.它表示暂停,并返回一个当前迭代的数据
3.如果没有下一个yield,运行到函数结束。生成器的next方法得到的结果 done为true

3、生成器内部 yield返回的数据,会被当作调用当前 next方法返回的数据 value的值 4、生成器函数的返回值会被当作迭代结束时的value的值。 5、生成器有个 throw方法,抛出错误,并不会进行赋值 7、生成器有个return方法,直接结束整个生成器。 8、如需要在生成器内部调用其它生成器,注意:如果直接调用,得到的是一个生成器,如果加 yield*号调用,则进入其生成器内部执行。