Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача на тему "Асинхронный рендеринг"

Avi Min Ученик (96), на голосовании 1 год назад
Не могу никак решить эту задачу.
На вход подается массив объектов, описывающих данные для рендеринга. Объект имеет структуру:
interface RenderItem {
id: string;
priority: number;
render: () => Promise<RenderItem[]>;
}

От вас требуется написать асинхронную функцию, которая принимает на вход список элементов для рендеринга и максимальное количество элементов для одновременного рендеринга, а возвращает список идентификаторов всех элементов в порядке их рендеринга:

function renderAsync(renderItems: RenderItem[], n: Number): Promise<string[]>;

Необходимо рендерить элементы максимально возможными по количеству группами, но не большими, чем n элементов. Пока элементы группы не отрендерены, другие элементы не берутся в обработку, а ожидают своей очереди.
Элементы с одинаковым приоритетом нужно рендерить в порядке их перечисления или появления.
Примечания
Исходный код нужно оформить следующим образом:

module.exports = function (renderItems, n) {
// решение задачи}
Голосование за лучший ответ
Татьяна Просветленный (36384) 1 год назад
 const renderAsync = async (renderItems, n) => { 
let result = [];
let currentGroup = 0; // текущая группа элементов
let priorityGroups = {}; // объект для хранения групп элементов с одинаковым приоритетом
let activeCount = 0; // количество активных элементов

// Функция для рендеринга группы элементов
const renderGroup = async (group) => {
for (let i = 0; i < group.length; i++) {
const item = group[i];
const subItems = await item.render();
result.push(item.id);
activeCount--;
await renderAsync(subItems, n); // рекурсивный вызов для рендеринга подэлементов
}
};

while (renderItems.length > 0 || activeCount > 0) {
// Если количество активных элементов не превышает n и есть элементы для рендеринга
if (activeCount < n && renderItems.length > 0) {
const item = renderItems.shift();
if (priorityGroups[item.priority]) {
priorityGroups[item.priority].push(item);
} else {
priorityGroups[item.priority] = [item];
}
activeCount++;
} else {
// Если не можем добавить новый элемент в текущую группу,
// рендерим те элементы, которые уже есть в ней
await renderGroup(priorityGroups[currentGroup]);
delete priorityGroups[currentGroup];
currentGroup++;
}
}

return result;
};

module.exports = renderAsync;
Avi MinУченик (96) 1 год назад
?
Avi Min Ученик (96) Avi Min, увидела)
Avi MinУченик (96) 1 год назад
К сожалению не работает
Похожие вопросы