JavaScript向迭代器添加“ return”方法无法正确关闭迭代器

问题描述

我正在学习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 (将#修改为@)