Сегодня хочется немного рассказать про собственную наработку https://github.com/lexich/async-paginator
Это небольшая библиотека, которая позволяет обрабатывать коллекции данных, используя асинхронные итераторы. При этом доступна гибкая настройка количества одновременного запуска задач (можно запустить сразу все или разбить на группы).
import { paginatorUnordered, paginator } from 'async-paginator';
const sleep = (delay: number) => new Promise<void>((resolve) => setTimeout(resolve, delay));
// for ordering use `paginator` instead of paginatorUnordered
const paginate = paginatorUnordered([1, 2, 3, 4, 5, 6, 7, 8], async (num) => {
if (num % 2 === 0) {
await sleep(10); // timeout 10ms
}
return num * 10;
}, {
offset: 1,
chunks: 2,
mode: 'chunks',
});
const result: number[] = [];
for await (const item of paginate) {
if (!(item instanceof PaginationAsyncError)) {
result.push(item.data);
}
}
console.log("RESULT: ", result);
// RESULT: [30, 20, 50, 40, 70, 60, 80]