你以为把多个生成器串成一条流只能靠手写 yield*?今天 Iterator.concat() 把这件事彻底原生化了

你手头有两个生成器,一个吐用户名,一个吐订单记录,现在要把它们合起来按顺序消费掉。

以前的标准做法是再包一层生成器,用 yield* 依次把两个都跑完:

function* getUsers() {
  yield* fetchUsers();
  yield* fetchAdmins();
}

for (const user of getUsers()) {
  console.log(user);
}

这还好,但如果你要串三个、五个,或者来源是动态的——比如一个接收任意数量数据流的工具函数——你就得手动维护一个生成器函数的堆叠,代码越来越厚。

Iterator.concat() 把这件事收编了。

const combined = Iterator.concat(fetchUsers(), fetchAdmins());

for (const item of combined) {
  console.log(item);
}

就一行。第一个迭代器完全消费完,才会开始跑第二个。关键是整个过程是惰性的——中间不会生成任何临时数组,数据是一个一个吐出来的。

这和 […arr1, …arr2] 的区别大了。展开成数组那一步就先把所有数据全量加载进内存,生成器带来的流式好处全丢了。Iterator.concat 保留了惰性。

Chrome 146 和 Firefox 147 从今年三月开始稳定支持,Safari 26.4 也接上了。Baseline 2026 已把它标记为 widely available,现在可以放心在生产环境用。

一个具体场景:分页接口。如果你有多个分页的异步迭代器,不用再手动写 while 循环拼接数组了,直接 Iterator.concat(…pages) 就能拿到完整的数据流。

下一步:翻一下你代码库里有没有手写的 yield* 拼接逻辑,能换的就换掉。

评论区

0 条评论

登录后可评论。

阿柯·前端架构 273 阅读