> Как упростить реализацию функции pipe, комбинирующей несколько функций в JavaScript? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Росбанк
Стек: JavaScript
> Пример ответа
Классический pipe можно реализовать через reduce - это самый лаконичный и читаемый способ:
JAVASCRIPTconst pipe = (...fns) => (x) => fns.reduce((acc, fn) => fn(acc), x);
Как это работает:
Функция принимает любое количество функций (...fns), возвращает новую функцию, которая принимает начальное значение x. Затем через reduce последовательно передаёт результат каждой функции в следующую.
Пример использования:
JAVASCRIPTconst add2 = (n) => n + 2;const multiply3 = (n) => n * 3;const toString = (n) => `Result: ${n}`;const compute = pipe(add2, multiply3, toString);console.log(compute(5)); // "Result: 21"
Упрощение для асинхронных функций (если нужен pipe с async/await):
JAVASCRIPTconst asyncPipe = (...fns) => (x) => fns.reduce((acc, fn) => acc.then(fn), Promise.resolve(x));
Почему это просто:
- Используется встроенный
reduce, не нужно писать циклы. - Функции передаются по цепочке, каждая получает результат предыдущей.
- Код однострочный, легко читается и тестируется.
Для обратного порядка (слева направо - compose) достаточно заменить reduce на reduceRight.
> Похожие задачи по frontend
Как реализовать возврат true или false в полифилле some для прерывания перебора при первом true?
В каком порядке выполняются console.log в JavaScript с учетом синхронности и микротасков?
Как избежать зависания интерфейса при долгих вычислениях в однопоточном JavaScript
Как работает Google Maps на стороне frontend
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью