...

Метод searchByGenerator

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

Метки:
  1. kirillovykh

    kirillovykh Участник

    Использование генераторов для перебираемых объектов при поиске элементов разбиралось в https://community.elma365.com/ru/threads/95/

    В данном случае, поиск вынесен в метод с типизацией по элементу приложения для удобства переиспользования в решении.

    Код:
    
    async function searchByGenerator<extends ItemDataextends ItemData>(searchApplicationSearch<DP>): Promise<ApplicationItem<DP>[]> {
        
    // Размер пакета промисов (оптимальное значение)
        
    const promises_package_size 10;
        const 
    search_size 1000;

        const 
    count await search.count();

        const 
    generator = {
            
    from0,
            
    tocount,
            *[
    Symbol.iterator]() {
                for (
    let i this.from<= this.to+= search_size) {
                    yield 
    search.from(i).size(search_size).all();
                }
            }
        }

        const 
    promises = [...generator];
        const 
    itemsApplicationItem<DP>[] = [];

        
    // Ожидание промисов по пакетам в соответствии с заданным размером пакета
        
    for (let i 0promises.length+= promises_package_size) {
            const 
    results await Promise.all(promises.slice(ipromises_package_size));
            for (
    let result of results) {
                
    items.push(...result);
            }
        }

        return 
    items;
    }

    Дополнительно возможно вынести count в параметры метода, чтобы ограничивать размер получаемой выборки