Page 170 - 你不知道的JavaScript(下卷)
P. 170
3.2.3 提前完成
本章前面讨论过,生成器上附着的迭代器支持可选的 return(..) 和 throw(..) 方法。这两
种方法都有立即终止一个暂停的生成器的效果。
考虑:
function *foo() {
yield 1;
yield 2;
yield 3;
}
var it = foo();
it.next(); // { value: 1, done: false }
it.return( 42 ); // { value: 42, done: true }
it.next(); // { value: undefined, done: true }
return(x) 有点像强制立即执行一个 return x,这样就能够立即得到指定值。一旦生成器
完成,或者正常完毕或者像前面展示的那样提前结束,都不会再执行任何代码也不会返回
任何值。
return(..) 除了可以手动调用,还可以在每次迭代的末尾被任何消耗迭代器的 ES6 构件自
动调用,比如 for..of 循环和 spread 运算符 ...。
这个功能的目的是通知生成器如果控制代码不再在它上面迭代,那么它可能就会执行清理
任务(释放资源、重置状态等)。和普通的函数清理模式相同,完成这一点的主要方式是
通过 finally 子句:
function *foo() {
try {
yield 1;
yield 2;
yield 3;
}
finally {
console.log( "cleanup!" );
}
}
for (var v of foo()) {
console.log( v );
}
// 1 2 3
// cleanup!
var it = foo();
代码组织 | 147
图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权