Код Middle Event loop и libuv обновлено

Тяжёлый цикл без блокировки event loop

Условие

Обработка большого массива синхронным циклом блокирует event loop: пока он крутится, сервер не отвечает ни на один запрос. Напиши processInChunks(items, fn, chunkSize): вызывает синхронную fn(item, index) для всех элементов, но после каждых chunkSize элементов уступает event loop (через setTimeout(..., 0)), чтобы успели выполниться другие задачи. Возвращает промис с массивом результатов.

В Node для этого обычно используют setImmediate, но решение должно работать и в браузере, поэтому setTimeout.

Что проверяют тесты

  • результаты в порядке

  • другие задачи успевают выполниться между чанками

  • пустой массив

  • возвращает промис

  • индекс передаётся

  • ошибка fn отклоняет промис

Как подойти

Подсказки: 2
  1. await new Promise(r => setTimeout(r, 0)) после каждых chunkSize элементов.
  2. Микрозадача (await Promise.resolve()) не поможет: таймеры и I/O ждут, пока опустеет очередь микрозадач.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме