Допустим, у нас есть input, на который мы подписаны и у которого забираем вводимое значение:
Этот метод не совсем верный, так как в subscribe мы должны выводить уже готовое значение. Поэтому можно использовать метод map для промежуточной обработки получаемых из потока событий:
Но в RxJs есть специальный метод pluck, который упрошает выборку значения из нужного поля объекта:
То есть, мы знаем, что работает с объектом event, у которого есть поле target, у которого также есть поле value, значение которого нам нужно получить. Поэтому воссоздаем структуру объекта event так - pluck(‘target’, ‘value’).
Первый “серьезный” метод в моей RxJs-копилке знаний. На самом деле все просто - этот метод получает на вход поток, обрабатывает каждый event этого потока; и возвращает (это важно помнить!) новый поток, с модифицированными events.
Map’s job - is to transform things!
Обрабатывает при помощи callback-функции - в принципе, чрезвычайно похоже на то, как это делает метод map в “классическом” JavaScript.
Простейший пример использования оператора map:
В данном случае создаем Observable-объект из простого массива - source. Затем каждый event преобразовываем при помощи map - увеличиваем на единицу. И возвращаем новый Observable-объект - result. На который можно подписаться и получить такой результат - 2,3,4,5,6,,7,8.
Так как метод map возвращает новый объект result, а оригинальный source остается неизменным, то метод map относится к immutable-операторам.
Чуть более сложный пример:
В принципе - этот пример аналогичен предыдущему, с тем лишь отличием, что source - это уже массив объектов. И в методе map при помощи деструктурирования получаем из каждого объекта этого массива значения свойства name. Получается новый Observable-объект result, состоящий из потока имен - Joe, Frank, Ryan.
Методы take() и takeLast() в общем очень схожи с методами first() и last(). С тем лишь отличием, что первые два могут возвращать не просто - самое первое или самое последнее событие потока; они могут возвращать указанное количество событий.
Метод take()
Подключение - import { take } from ‘rxjs/operators’;
Метод take() принимает в качестве аргумента число - количество событий потока, которые нужно вернуть с момента старта потока.
Например:
… очевидно, что этот код вернет первые десять событий из потока source -> 0,1,2,3,4,5,6,7,8,9.
Метод takeLast()
Подключение - import { takeLast } from ‘rxjs/operators’;
В противоположность методу take(), метод takeLast() возвратит заданное количество последних событий потока.
Важный момент - метод takeLast() вернет события только после того, как поток завершится.
Пример:
… этот код вернет последние четыре события потока source -> 6,7,8,9.
Принимает на вход поток событий и возвращает первое событие этого потока, после чего завершает свое выполнение. В качестве аргумента может принимать функцию фильтрации.
Подключение first() - import { first } ‘rxjs/operators’
Пример - перехватываем только первый клик на документе, все последующие - игнорируем:
Более интересный пример - возвращаем первое событие потока, которое удовлетворяет условию; после чего прекращаем работу:
Метод last()
Противоположность методу first(); принимает на вход поток событий и возвращает последнее событие этого потока; после чего прекращает свою работу.