Большинство программистов стараются, чтобы их код был как можно более СУХИМ (не повторяйте себя), так как поддерживать чистоту кода — хорошая практика. Но при чем здесь операторы RxJS? Давайте узнаем 👀

При работе с наблюдаемыми мы можем столкнуться с большим количеством повторяющегося кода. Но не о чем беспокоиться, потому что RxJS предоставляет возможность создавать собственные операторы. Некоторые примеры приведены ниже 👇

Оператор для обработки входных событий

В этом примере мы создадим собственный оператор RxJS, используя метод pipe. Давайте представим, что в нашем проекте у нас много прослушивателей изменений входных значений. В таких ситуациях мы часто используем такие операторы, как debounceTime и distinctUntilChanged. Благодаря возможности создавать собственные операторы, мы можем объединить эти два оператора в один и не повторять их каждый раз.

Проверьте код ниже.

Оператор debounceTime задерживает передачу значений из источника Observable на указанное время и выдает последнее значение, выданное в течение этого временного окна.

С другой стороны, оператор distinctUntilChanged отфильтровывает значения, которые совпадают с предыдущим значением, испускаемым исходным Observable.

Вместе эти операторы обеспечивают полезную комбинацию для обработки входных событий. Они позволяют вам дождаться, пока пользователь закончит печатать, прежде чем выполнять дорогостоящую операцию, и вы хотите обрабатывать каждое уникальное событие только один раз.

Вот пример того, как вы можете использовать эти операторы.

Вот и все! С valueChangesOperator вам больше не нужно многократно повторять один и тот же код 🙌

Оператор для обработки HTTP-запросов

Вы также можете создавать более продвинутые операторы. Например, если в большинстве случаев мы обрабатываем HTTP-запросы аналогичным образом, мы можем создать собственный оператор и для этого.

Предположим, что в нашем приложении мы хотим отображать сообщение при успешном выполнении HTTP-запроса или возникновении ошибки. Кроме того, мы всегда используем оператор takeUntil для отписки и хотим отображать загрузчик при отправке запроса. После завершения запроса мы хотим скрыть загрузчик.

Наш пользовательский оператор RxJS для этого и пример его использования выглядит следующим образом.

Эта функция является пользовательским оператором RxJS, который возвращает MonoTypeOperatorFunction<T>. Он создает конвейер операторов, которые можно применять к входному Observable, включая tap, catchError, finalize и takeUntil.

Оператор tap используется для отображения сообщения об успехе.

Оператор catchError перехватывает любые ошибки, выдаваемые входным Observable, и обрабатывает их, отображая сообщение об ошибке и возвращая новый Observable, который выдает ошибку, используя функцию throwError.

Оператор finalize выполняет побочный эффект, когда входной Observable завершается или возникает ошибка, в этом случае устанавливая состояние загрузки на false.

Оператор takeUntil завершает вывод Observable, когда указанный Observable (this.destroy$) выдает значение. Это полезно для отмены подписки, когда компонент уничтожен.

Этот оператор имеет побочные эффекты, поэтому он должен быть создан внутри компонента. Если вы хотите использовать такой оператор в нескольких компонентах, вам необходимо изменить его и удалить побочные эффекты.

Подведение итогов

Приведенные выше примеры демонстрируют, как вы можете создавать свои собственные операторы RxJS и настраивать их в соответствии со своими конкретными потребностями. Я надеюсь, что эта статья была полезной, и благодаря этому вы сможете создавать свои собственные операторы. Если вы хотите протестировать приведенный выше код, вы можете сделать это здесь, на StackBlitz ⚡️.

Если вам понравилось это читать, пожалуйста, хлопните в ладоши 👏 . Не стесняйтесь подписываться на меня и оставлять комментарии с вашими отзывами 👇.