问你generator是什么?
迭代器
一旦遇到 yield 表达式,生成器的代码将被暂停运行,直到生成器的 next() 方法被调用。每次调用生成器的next()方法时,生成器都会恢复执行,直到达到以下某个值:
-
yield, 导致生成器再次暂停并返回生成器的新值。下一次调用next()时,在yield之后紧接着语句继续执行。
-
throw, 用于从生成器抛出异常。这让生成器完全停止执行,并在调用者中继续执行,正如通常情况下抛出异常一样。
-
到达生成器函数的结尾;在这种情况下,生成器的执行结束,并且IteratorResult给调用者返回undefined并且done为true。
-
到达return语句。在这种情况下,生成器的执行结束,并将IteratorResult返回给调用者,其值是由return语句指定的,并且done为true。
生成器函数声明
function* countAppleSales () {
const saleList = [3, 7, 5]
for (const i = 0; i < saleList.length; i++) {
yield saleList[i]
}
}
一旦生成器已定义,可以通过构造一个迭代器来使用它
const appleStore = countAppleSales() // Generator { }
console.log(appleStore.next()) // { value: 3, done: false }
console.log(appleStore.next()) // { value: 7, done: false }
console.log(appleStore.next()) // { value: 5, done: false }
console.log(appleStore.next()) // { value: undefined, done: true }
一个无限迭代器
function* idMaker() {
let index = 0
while(true)
yield index++
}
let gen = idMaker() // "Generator { }"
console.log(gen.next().value) // 0
console.log(gen.next().value) // 1
console.log(gen.next().value) // 2
// ...
yield*的示例
function* anotherGenerator(i) {
yield i + 1;
yield i + 2;
yield i + 3;
}
function* generator(i){
yield i;
yield* anotherGenerator(i);// 移交执行权
yield i + 10;
}
var gen = generator(10);
console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20
向生成器传值
function* idMaker(){
console.log(arguments) // Arguments [5, callee: ƒ, Symbol(Symbol.iterator): ƒ]
var index = arguments[0] || 0;
console.log(index) // 5
while(true)
yield index++; // index++ 先返回后加1
}
var gen = idMaker(5);
console.log(gen.next().value); // 5
console.log(gen.next().value); // 6