问题描述
我正在学习JavaScript ES6迭代器模式,并遇到了这个问题:
const counter = [1,2,3,4,5];
const iter = counter[Symbol.iterator]();
iter.return = function() {
console.log("exiting early");
return { done: true };
};
for (let i of iter) {
console.log(i);
if (i >= 3) {
break;
}
}
console.log('---');
for (let i of iter) {
console.log(i);
}
// 1
// 2
// 3
// exiting early
// ---
// 4
// 5
因此,我向从数组中提取的迭代器添加了return
方法定义。尽管调用了return方法,但实际上并没有关闭迭代器。相比之下,如果我在定义中定义迭代器return
方法,它将按预期工作:
class Counter {
[Symbol.iterator]() {
let count = 1;
return {
next() {
if (count <= 5) {
return {
done: false,value: count++
}
} else {
return {
done: true,value: undefined
}
}
},return() {
console.log('exiting early');
return { done: true,value: undefined };
}
}
}
}
const myCounter = new Counter();
iter = myCounter[Symbol.iterator]();
for (let i of myCounter) {
console.log(i);
if (i >= 3) {
break;
}
}
console.log('---');
for (let i of myCounter) {
console.log(i);
}
// 1
// 2
// 3
// exiting early
// ---
// 1
// 2
// 3
// 4
// 5
我的问题是,为什么会出现这种意外行为?我假设如果没有调用return
方法,则迭代器将不会关闭,直到通过调用next
到达终点为止。但是添加return
属性将正确地“调用” return
方法,因为我获得了控制台日志,但是即使我在{{1}中返回了{ done: true }
,实际上也不会终止迭代器}方法。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)