Версия 5 RXJS представила концепцию салтал (также известен как Pipable ) Операторы. Версия 6 пошла на шаг вперед и установил старый способ вызовы операторов (цепочка метода).
Вы, возможно, уже использовали труба функция Но вы действительно понимаете, что это делает?
Эта статья была первоначально размещена мой блог .
Сочинение функций
Rxjs часто называют Функциональное реактивное программирование библиотека. Не должно быть сюрпризом, что вы найдете в нем много функциональных программ. Один из них – это труба функция
Взгляните на приведенный ниже кусок кода:
const getElement =
(id) => document.getElementById(id);
const getValue =
(element) => element.value;
function logElementValue(id) {
const el = getElement(id);
const value = getValue(el);
console.log(value);
}
LogElementValue Функция принимает id и выйдет в консоль значение элемента с предоставленным id Анкет
Можете ли вы увидеть шаблон в реализации этой функции? Во -первых, он вызывает getElement с id и хранит результат в Эль Анкет Далее, результат передается GetValue который дает новый результат, Эль Анкет Наконец, Эль передается Консоль.log Анкет
Эта функция делает, это просто взятие результата функции и передача ее в качестве аргумента другой функции.
Есть ли лучший, более краткий способ реализации этой функции?
Допустим, у нас просто есть две функции ( getElement и GetValue ) Мы будем реализовать общую функцию с именем составить это пройдет результат getElement к getValue .
const compose = (f, g) => x => g(f(x));
Определение очень простое, но может занять минуту, чтобы разобрать. Мы определили функцию, которая принимает две функции f и грамм (Это было бы getElement и getValue в нашем случае) и возвращает новую функцию. Эта новая функция примет аргумент, передайте ее f а затем передайте результат g .
Это именно то, что нам нужно! Теперь я могу переписать LogElementValue :
function logElementValue(id) {
const getValueFromId = compose(getElement, getValue);
const value = getValueFromId(id);
console.log(value);
}
Как насчет более двух функций?
Но ждать! Как только у нас появится результат вызова GetValueFromid Мы сразу передаем это Консоль.log Анкет Так что это та же схема здесь. Мы могли бы написать это так:
function logElementValue(id) {
const getValueFromId = compose(getElement, getValue);
const logValue = compose(getValueFromId, console.log);
logValue(id);
}
Но жизнь была бы намного проще, если Составьте может взять любое количество функций. Можем ли мы это сделать? Конечно:
const composeMany = (...args) => args.reduce(compose);
Еще один мозговой тизер! Composemany принимает любое количество функций. Они хранятся в args множество. Мы уменьшить над args Создание каждой функции с результатом сочинения предыдущих функций.
В любом случае, результаты – это функция, которая занимает любое количество функций и пройдет результат N-th функция (N+1) -th функция
Но чего мы достигли этого?
function logElementValue(id) {
const logValue = composeMany(getElement, getValue, console.log);
logValue(id);
}
Что может быть упрощено еще больше:
const logElementValue = composeMany(getElement, getValue, console.log);
Разве это не круто? Мы значительно упростили код. Теперь очень ясно, что LogElementValue делает.
И кстати – Composemany это просто имя, пришло. Официальное имя труба !
const logElementValue = pipe(getElement, getValue, console.log);
Вернуться к RXJS
Давайте возьмем пример труба Использование в RXJS.
number$.pipe(
map(n => n * n),
filter(n => n % 2 === 0)
);
Мы также можем написать это по -другому:
const { pipe } = rxjs;
const transformNumbers = pipe(
map(x => x * x),
filter(x => x % 2 === 0),
);
transformNumbers(number$).subscribe(console.log);
И результат точно такой же! Как видите, труба Функция в RXJS ведет себя точно так же, как труба функция, которую мы определили в первой части статьи. Он занимает ряд функций и сочиняет их, передавая результат функции в качестве аргумента другой функции.
Вы можете сказать, что это отличается от предыдущего примера, потому что здесь мы вызовываем карта и фильтр И не просто прохождение их. На самом деле, оба карта и фильтр вернуть функции. Мы не составляем карта и фильтр сами себя а скорее функции, возвращаемые, вызывая их.
Вы можете проверить, как реализует RXJS труба функция Здесь Анкет
Оператор трубопровода
Наша функция – такая полезная концепция, что она может быть добавлена в качестве отдельного оператора на язык JavaScript!
Это будет означать, что пример из предыдущей статьи может быть написан еще проще:
const logElementValue = getElement |> getValue |> console.log;
Вы можете увидеть детали предложения Здесь Анкет
Резюме
Я надеюсь, что эта статья помогла вам понять, что труба функция – это все о. Теперь вы должны чувствовать себя более комфортно, используя это!
Тот факт, что RXJS мигрировал из традиционного, объектно-ориентированного подхода к применению операторов к подходу к трубопроводу, показывает, насколько сильным является влияние функционального программирования в настоящее время. Я думаю, это здорово!
Дайте мне знать в комментариях, если вы предпочитаете труба Функция традиционной цепочки методов.
Хотите узнать больше?
Вам понравилась эта статья TypeScript? Бьюсь об заклад, тебе тоже понравится моя книга!
⭐ Advanced TypeScript ⭐ ️
Оригинал: “https://dev.to/miloszpp/deep-dive-into-pipe-function-in-rxjs-3bmi”