Тяжёлый цикл без блокировки event loop
Условие
Обработка большого массива синхронным циклом блокирует event loop: пока он крутится, сервер не отвечает ни на один запрос. Напиши processInChunks(items, fn, chunkSize): вызывает синхронную fn(item, index) для всех элементов, но после каждых chunkSize элементов уступает event loop (через setTimeout(..., 0)), чтобы успели выполниться другие задачи. Возвращает промис с массивом результатов.
В Node для этого обычно используют setImmediate, но решение должно работать и в браузере, поэтому setTimeout.
Что проверяют тесты
результаты в порядке
другие задачи успевают выполниться между чанками
пустой массив
возвращает промис
индекс передаётся
ошибка fn отклоняет промис
Как подойти
Подсказки: 2
await new Promise(r => setTimeout(r, 0))после каждыхchunkSizeэлементов.- Микрозадача (
await Promise.resolve()) не поможет: таймеры и I/O ждут, пока опустеет очередь микрозадач.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Термины по теме
Ещё по теме «Event loop и libuv»
- Что блокирует event loop
- Объясни event loop в Node.js
- setImmediate и setTimeout внутри I/O
- setTimeout(0) против setImmediate на верхнем уровне
- Что такое libuv
- Рекурсивный process.nextTick
- process.nextTick и setImmediate
- Event loop Node и браузера: в чём разница