Использование генераторов для перебираемых объектов при поиске элементов разбиралось в https://community.elma365.com/ru/threads/95/
В данном случае, поиск вынесен в метод с типизацией по элементу приложения для удобства переиспользования в решении.
Код:
async function searchByGenerator<D extends ItemData, P extends ItemData>(search: ApplicationSearch<D, P>): Promise<ApplicationItem<D, P>[]> {
// Размер пакета промисов (оптимальное значение)
const promises_package_size = 10;
const search_size = 1000;
const count = await search.count();
const generator = {
from: 0,
to: count,
*[Symbol.iterator]() {
for (let i = this.from; i <= this.to; i += search_size) {
yield search.from(i).size(search_size).all();
}
}
}
const promises = [...generator];
const items: ApplicationItem<D, P>[] = [];
// Ожидание промисов по пакетам в соответствии с заданным размером пакета
for (let i = 0; i < promises.length; i += promises_package_size) {
const results = await Promise.all(promises.slice(i, i + promises_package_size));
for (let result of results) {
items.push(...result);
}
}
return items;
}
Дополнительно возможно вынести count в параметры метода, чтобы ограничивать размер получаемой выборки