使用ES迭代器的好处是什么?我知道在生成器函数(使用*的函数)上用于异步操作。
除了纯迭代器的用法,还有哪些用例呢?
请给我一些现实生活中的示例,无论是来自node.js还是浏览器使用都可以。
使用ES迭代器的好处是什么?我知道在生成器函数(使用*的函数)上用于异步操作。
除了纯迭代器的用法,还有哪些用例呢?
请给我一些现实生活中的示例,无论是来自node.js还是浏览器使用都可以。
主要有两个原因:
语言特性,例如 for/of
、展开运算符、解构赋值等,可以被构建为适用于任何支持标准迭代器接口的对象。
使用集合的程序员可以直接使用迭代器,也可以通过依赖它的语言特性间接使用它,并且可以以许多方式通用地与集合进行交互,而无需知道它是什么类型的集合。
作为在ES6中使用迭代器标准的语言特性的例子是,你可以有以下语言结构:
for (x of someObj) { ... }
而且for/of
逻辑只是在someObj
上使用迭代器接口。 它不需要知道可以迭代的所有对象类型的特定信息。 因此,由于这个原因,您可以使用支持标准迭代器的任何类型的对象进行for/of
循环。例如,您可以将其与数组、映射、集合或任何自定义对象一起使用,只要它支持迭代器接口。
给定对象上的迭代器实现定义了可迭代的元素以及它们呈现的顺序。
实际上,我发现更多地使用依赖于迭代器的语言特性(如for/of
)而不是直接使用迭代器,以便我可以以标准方式使用集合而无需知道它是什么类型的集合。
在我的编码中,我发现能够迭代一个对象非常方便,而无需知道它是什么类型的对象。这使我能够设计一个界面,可以传递Set
,Array
或有时甚至是Map
,只要我想要做的就是迭代集合中的项,我就不必关心它是哪个,并且不需要编写任何不同的代码。 如果调用方恰好有一个Set
可用,他们无需将其转换为Array
就可以调用API-他们只需要传递Set
。 而且,API中的代码不必检查它被传递的类型以适应其行为。
迭代器也是惰性评估的。 因此,在开始迭代之前,没有必要构建整个集合的临时数组。 如果集合很大和/或迭代没有完全遍历整个集合,则这可以使迭代更加高效。
迭代器可以是无限的。 例如,您可以拥有表示无限序列的斐波那契迭代器。
除了for/of
之外的其他ES6功能,也利用了迭代器:
spread syntax
yield*
destructuring assignment
Array.from()
这些功能可以与支持标准迭代器的任何对象一起使用。
有关更多详细信息,请参见以下文章:
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);
})();
.forEach
或使用循环,那么您就知道它的主要用途。澄清会帮助很多。 - loganfsmyth