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) 专享 尊重版权