Plan
Notes
生成器产生值
生产者与迭代器
- for of 可以循环可迭代的对象,但是无法向迭代器中的 next 传值
- iterable protocol: 可以在一个对象上自定义迭代器。请参考 demo
- 生成器返回迭代器
function* something() {
var nextVal;
while (true) {
if (nextVal === undefined) {
nextVal = 1;
} else {
nextVal = 3 * nextVal + 6;
}
yield nextVal;
}
}
停止生成器
- 一个生成器会构造一个迭代器,迭代器可以被 for of 循环
- 在 for...of 中使用 break 或者 return 会触发迭代器中的 finally
function* something() {
try {
var nextVal;
while (true) {
if (nextVal === undefined) {
nextVal = 1;
} else {
nextVal = 3 * nextVal + 6;
}
yield nextVal;
}
} catch (e) {
console.log("error", error);
} finally {
console.log("finally here");
}
}
var it = something();
for (let v of it) {
console.log("value", v);
if (v > 500) {
// break; // it 结束, 触发finally
// console.log(it.return("hello world").value); // it 结束, 触发finally
}
}
异步生成器
- 在异步的生成器中,yield 可以捕获异步的错误
- 可以通过 iterator.throw 向生成器内部抛入错误
More