Если вы работали с Angular, вы, вероятно, сталкивались с RxJS. Наблюдаемые объекты, служебные конструкции, множество аргументов метода канала, и каждый аргумент возвращается отдельной функцией с разным количеством аргументов. Есть интуитивно понятные функции, такие как filter или map. Первый явно фильтрует значения в наблюдаемом, а второй изменяет эти значения. Такие функции называются операторами. И чем глубже вы погружаетесь в RxJS, тем больше разных операторов вы изучаете. И, в конце концов, вы доберетесь до наблюдаемых наблюдаемых — наблюдаемых более высокого порядка. Для работы с такими потоками существуют специальные операторы — операторы высшего порядка (HOO). Они могут сгладить наблюдаемые или, другими словами, сделать их нормальными.

В этой статье я покажу вам, что в HOO нет ничего мифического, и расскажу, в каких случаях нужно использовать операторов высшего порядка. Сейчас вы подумаете, что это скучный лонгрид, но не торопитесь. Мы рассмотрим всего 4 оператора: switchMap, exhaustMap, concatMap и mergeMap.

переключательКарта

switchMap на сегодняшний день является самым популярным из всех. Но почему? По одной простой причине — этот оператор избавляется от состояния гонки.

Давайте изучим код:

const searchInput = document.getElementById('search-input');
const search$ = fromEvent(searchInput, 'input').pipe(
  map(event => event.target.value)
);

search$.subscribe((query) => {
  http.get('/search', {params: {query}}).subcribe((result) => {
    console.log(result);
  })
})

В этом коде мы находим ввод, с которым взаимодействует пользователь, и подписываемся на событие input. То есть search$ observable выдает строки. Внутри подписки мы видим, что для каждой испускаемой строки на сервер отправляется запрос, а ответ службы выводится на консоль.

В этом коде вы можете увидеть как минимум две проблемы:

  1. Состояние гонки. Обычно при поиске чего-либо пользователю важно видеть результат именно последнего запроса. Но такой код не дает нам гарантии, что последние данные, выведенные на консоль, соответствуют последней строке, выведенной в наблюдаемом объекте search$.
  2. Подписаться в подписке и не отписываться. Существует отличное эмпирическое правило, которое может сэкономить вам…