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) 专享 尊重版权
   165   166   167   168   169   170   171   172   173   174   175