...

Метод searchByGenerator

Тема в разделе "Скрипты и разработка", создана пользователем kirillovykh, 28 май 2024.

Метки:
  1. kirillovykh

    kirillovykh Участник

    Использование генераторов для перебираемых объектов при поиске элементов разбиралось в 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 в параметры метода, чтобы ограничивать размер получаемой выборки