mapLimit: параллельная обработка с ограничением
Условие
Напиши mapLimit(items, limit, fn): вызывает асинхронную fn(item, index) для каждого элемента, но одновременно в работе не больше limit вызовов. Возвращает промис с массивом результатов в исходном порядке. Если какой-то вызов упал, итоговый промис отклоняется этой ошибкой, новые вызовы больше не запускаются.
Так на бэкенде обходят 10 000 URL или пишут в БД пачками, не открывая 10 000 соединений разом.
Что проверяют тесты
результаты в исходном порядке
одновременно не больше limit
limit больше длины массива
пустой массив
ошибка отклоняет промис и останавливает запуск
fn получает индекс
Как подойти
Подсказки: 2
- Запусти
limit«воркеров», каждый в цикле берёт следующий индекс из общего счётчика. - Пиши результат по индексу, а не через push: так порядок сохранится.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Свой EventEmitter: on, off, once, emit
Следующий вопрос
retry с backoff и фильтром ошибок