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;
На вход подается массив объектов, описывающих данные для рендеринга. Объект имеет структуру:
interface RenderItem {
id: string;
priority: number;
render: () => Promise<RenderItem[]>;
}
От вас требуется написать асинхронную функцию, которая принимает на вход список элементов для рендеринга и максимальное количество элементов для одновременного рендеринга, а возвращает список идентификаторов всех элементов в порядке их рендеринга:
function renderAsync(renderItems: RenderItem[], n: Number): Promise<string[]>;
Необходимо рендерить элементы максимально возможными по количеству группами, но не большими, чем n элементов. Пока элементы группы не отрендерены, другие элементы не берутся в обработку, а ожидают своей очереди.
Элементы с одинаковым приоритетом нужно рендерить в порядке их перечисления или появления.
Примечания
Исходный код нужно оформить следующим образом:
module.exports = function (renderItems, n) {
// решение задачи}