迭代器

迭代器结构

  • 数字序列生成器实现标准的迭代器接口
var something = (function(){ 
 	var nextVal; 
	return { 
		 // for..of循环需要
		 [Symbol.iterator]: function(){ return this; }, 
		 // 标准迭代器接口方法
		 next: function(){ 
		 if (nextVal === undefined) { 
		 	nextVal = 1; 
		 } 
		 else { 
		 nextVal = (3 * nextVal) + 6; 
		 } 
		 return { done:false, value:nextVal }; 
		 } 
	 }; 
})();

something.next().value; // 1 
something.next().value; // 9 
something.next().value; // 33 
something.next().value; // 105
  • 在for…of 循环在每次迭代中自动调用 next(),它不会向 next() 传入任何值,并且会在接收到 done:true 之后自动停止。
for (var v of something) { 
	console.log( v ); 
	// 不要死循环!
	if (v > 500) { 
		break; 
	} 
} 
// 1 9 33 105 321 969
  • 如果需要传递参数到迭代器里面,可以手动调用
for (
    var ret;
    (ret = something.next()) && !ret.done;
) {
    console.log(ret.value);
    // 不要死循环!
    if (ret.value > 500) {
        break;
    }
}
// 1 9 33 105 321 969

使用生成器的方式实现之前的something

function *something() {
   try {
       var nextVal;
       while (true) {
           if (nextVal === undefined) {
               nextVal = 1;
           }
           else {
               nextVal = (3 * nextVal) + 6;
           }
           yield nextVal;
       }
   }
       // 清理子句
   finally {
       console.log( "cleaning up!" );
   }
}
  • 使用方式和上述类似,停止方式可以增加return的方式。
  • 调用 it.return(…) 之后,它会立即终止生成器,这当然会运行 finally 语句。
  • 另外,它还会把返回的 value 设置为传入 return(…) 的内容,这也就是 “Hello World” 被传出去的过程。
  • 现在我们也不需要包含 break 语句了,因为生成器的迭代器已经被设置为done:true,所以 for…of 循环会在下一个迭代终止。
var it = something();
for (var v of it) {
    console.log( v );
    // 不要死循环!
    if (v > 500) {
        console.log(
            // 完成生成器的迭代器
            it.return( "Hello World" ).value
        );
        // 这里不需要break 
    }
}
// 1 9 33 105 321 969 
// cleaning up!
// Hello World
  • 抛出异常
it.throw( err );
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值