Page 158 - 你不知道的JavaScript(下卷)
P. 158

调用 Fib[Symbol.iterator]() 方法的时候,会返回带有 next() 和 return(..) 方法的迭代
                 器对象。通过放在闭包里的变量 n1 和 n2 维护状态。

                 接下来考虑一个迭代器,它的设计意图是用来在一系列(也就是一个队列)动作上运行,
                 一次一个条目:

                     var tasks = {
                         [Symbol.iterator]() {
                             var steps = this.actions.slice();

                             return {
                                 // 使迭代器成为iterable
                                 [Symbol.iterator]() { return this; },

                                 next(...args) {
                                     if (steps.length > 0) {
                                        let res = steps.shift()( ...args );
                                        return { value: res, done: false };
                                     }
                                     else {
                                         return { done: true }
                                     }
                                 },

                                 return(v) {
                                     steps.length = 0;
                                     return { value: v, done: true };
                                 }
                             };
                         },
                         actions: []
                     };

                 tasks 上的迭代器走过 actions 数组属性中找到的函数(如果有的话),然后一次一个执行
                 这些函数,把传入 next(..) 的所有参数传入,将其返回值在标准 IteratorResult 对象中
                 返回。

                 下面是这个 tasks 队列的一种使用方式:
                     tasks.actions.push(
                         function step1(x){
                             console.log( "step 1:", x );
                             return x * 2;
                         },
                         function step2(x,y){
                             console.log( "step 2:", x, y );
                             return x + (y * 2);
                         },
                         function step3(x,y,z){
                             console.log( "step 3:", x, y, z );
                             return (x * y) + z;


                                                                             代码组织   |   135

                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   153   154   155   156   157   158   159   160   161   162   163