← 中文资源

简体中文版本

从异步可迭代对象中批量读取数据

把异步可迭代对象按固定大小分批,逐批产出完整批次与最后一个不足批次,避免一次性缓冲全部数据。

阅读英文原文

功能说明

处理异步数据源时,逐条写入数据库或发送请求会产生大量小操作。该生成器把任意异步可迭代对象按固定大小分批,满一批立即 yield,最后不足一批也会输出。collectBatches 则把结果收集成二维数组,便于测试和小规模处理,同时保持流式消费能力。

关键代码

batchAsync 校验 size 为正整数和源非空,使用 for await…of 同时支持异步和同步可迭代对象。每加入一项检查长度,达到 size 时 yield 当前数组并重置。循环结束后若仍有剩余项,再 yield 最后一个部分批次。

for await (const item of source) {
  batch.push(item);
  if (batch.length === size) {
    yield batch;
    batch = [];
  }
}
if (batch.length > 0) yield batch;

使用注意

生成器会按需消费源,调用方提前 break 时剩余数据不会被读取。批次数组是新数组,但元素仍共享引用。size 过大可能占用较多内存。源抛错会直接传播给消费者。collectBatches 会一次性保留所有批次,只适合数据量可控的场景。

验证方式

断言 collectBatches([1, 2, 3, 4, 5], 2) 返回 [[1, 2], [3, 4], [5]]。空源返回空数组,异步生成器源同样分批。size 为 0 或小数抛 RangeError。消费者只取第一批时源未被完全读取。非可迭代源在迭代时抛 TypeError。