compose: цепочка middleware как в Koa
Условие
Напиши compose(middlewares): возвращает функцию (ctx) => Promise, которая выполняет middleware по очереди. Каждое middleware имеет вид async (ctx, next) => {...}: вызов await next() передаёт управление следующему и ждёт, пока вся оставшаяся цепочка отработает (модель «луковицы»). Если middleware не вызвал next, цепочка дальше не идёт. Повторный вызов next() в одном middleware отклоняется ошибкой с сообщением next() called multiple times. Ошибка в любом middleware отклоняет итоговый промис (и её можно поймать try/catch вокруг await next() выше по цепочке).
Что проверяют тесты
порядок луковицы
ctx общий
без next цепочка обрывается
ошибку ловит внешний middleware
синхронный throw тоже превращается в отклонение
двойной next
пустой список
Как подойти
Подсказки: 2
- Рекурсивная
dispatch(i), которая вызываетmiddlewares[i]сnext = () => dispatch(i + 1). - Запоминай последний вызванный индекс, чтобы поймать повторный
next.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Content negotiation по заголовку Accept
Следующий вопрос
Курсорная пагинация по (created_at, id)