ES6迭代器的使用案例

4

使用ES迭代器的好处是什么?我知道在生成器函数(使用*的函数)上用于异步操作。

除了纯迭代器的用法,还有哪些用例呢?

请给我一些现实生活中的示例,无论是来自node.js还是浏览器使用都可以。


4
它们并不只存在于JavaScript中。 你知道它们在其他语言中是如何使用的吗? - 4castle
除了“迭代事物”之外,我不确定您正在寻找什么样的示例。如果您曾经使用过ES5的.forEach或使用循环,那么您就知道它的主要用途。澄清会帮助很多。 - loganfsmyth
ES6生成器有哪些for循环无法实现的功能?这个问题的回答是否解决了您的疑问? - Bergi
2个回答

13

主要有两个原因:

  1. 语言特性,例如 for/of、展开运算符、解构赋值等,可以被构建为适用于任何支持标准迭代器接口的对象。

  2. 使用集合的程序员可以直接使用迭代器,也可以通过依赖它的语言特性间接使用它,并且可以以许多方式通用地与集合进行交互,而无需知道它是什么类型的集合。

作为在ES6中使用迭代器标准的语言特性的例子是,你可以有以下语言结构:

for (x of someObj) { ... }
而且for/of逻辑只是在someObj上使用迭代器接口。 它不需要知道可以迭代的所有对象类型的特定信息。 因此,由于这个原因,您可以使用支持标准迭代器的任何类型的对象进行for/of循环。例如,您可以将其与数组、映射、集合或任何自定义对象一起使用,只要它支持迭代器接口。

给定对象上的迭代器实现定义了可迭代的元素以及它们呈现的顺序。

实际上,我发现更多地使用依赖于迭代器的语言特性(如for/of)而不是直接使用迭代器,以便我可以以标准方式使用集合而无需知道它是什么类型的集合。

在我的编码中,我发现能够迭代一个对象非常方便,而无需知道它是什么类型的对象。这使我能够设计一个界面,可以传递SetArray或有时甚至是Map,只要我想要做的就是迭代集合中的项,我就不必关心它是哪个,并且不需要编写任何不同的代码。 如果调用方恰好有一个Set可用,他们无需将其转换为Array就可以调用API-他们只需要传递Set。 而且,API中的代码不必检查它被传递的类型以适应其行为。

迭代器也是惰性评估的。 因此,在开始迭代之前,没有必要构建整个集合的临时数组。 如果集合很大和/或迭代没有完全遍历整个集合,则这可以使迭代更加高效。

迭代器可以是无限的。 例如,您可以拥有表示无限序列的斐波那契迭代器。


除了for/of之外的其他ES6功能,也利用了迭代器:

spread syntax
yield*
destructuring assignment
Array.from()

这些功能可以与支持标准迭代器的任何对象一起使用。


有关更多详细信息,请参见以下文章:

ECMAScript 6中的可迭代对象和迭代器

实践中的ES6迭代器和生成器


0
export const execInBatch = async <T>(
  items: T[],
  batchSize: number,
  callback: (item: T[]) => Promise<void>
) => {
  for (const batch of asChunks(items, batchSize)) {
    await callback(batch);
    await new Promise((resolve) => setTimeout(resolve, 1000));
  }
  return true;
};

export function* asChunks<T>(arr: T[], chunkSize: number) {
  let chunk = [];
  for (const item of arr) {
    chunk.push(item);
    if (chunk.length === chunkSize) {
      yield chunk;
      chunk = [];
    }
  }
  if (chunk.length > 0) {
    yield chunk;
  }
}

(async () => {
  const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  const fn = async (item: number[]) => {
    console.log(item);
    return;
  };
  const data = await execInBatch(items, 2, fn);
  console.log(data);
})();

我已经为批处理任务创建了这个函数。

重要的是不仅要发布代码,还要包括代码的描述以及为什么建议使用它。这有助于他人理解代码的上下文和目的,并使其对阅读问题或答案的其他人更有用。@Amit Gujar. - DSDmark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接