首页 > 解决方案 > 无法在使用 *[Symbol.iterator]() 生成器 javascript 创建的可迭代对象上使用 next()

问题描述

我试过用谷歌搜索这个并查看类似的问题,但我似乎错过了一些基本的东西

let collection = {
    items: [],
    *[Symbol.iterator]() {
        for (let item of this.items) {
            yield item;
        }
    }
}
collection.items.push(1);
collection.items.push(2);
console.log(collection.next()); 

这会引发错误

console.log(collection.next());
                       ^

TypeError: collection.next is not a function 

根据我的阅读,我应该能够在集合对象上使用 next() ,因为这会调用 Symbol.iterator 属性?

标签: javascriptgeneratornext

解决方案


需要调用[Symbol.iterator]()方法获取迭代器对象,然后next()在返回的对象上调用方法:

let collection = {
  items: [],
  *[Symbol.iterator]() {
    for (let item of this.items) {
      yield item;
    }
  }
};

collection.items.push(1);
collection.items.push(2);

let iterator = collection[Symbol.iterator]();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

请记住,数组本身已经实现了可迭代协议,实际上您通过使用循环在[Symbol.iterator]()定义中使用了该协议,因此该对象在这里并不是必需的:for...ofcollection

let items = [];

items.push(1);
items.push(2);

let iterator = items[Symbol.iterator]();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());


推荐阅读