В чем преимущество switchMap

Ответ

switchMap из RxJS отменяет предыдущий внутренний Observable при каждом новом внешнем значении, что полезно для предотвращения утечек памяти и гонки запросов.

Пример:

input$.pipe(
  switchMap(value => http.get(`/api/search?q=${value}`))
).subscribe(results => console.log(results));

Преимущества:

  1. Автоматическая отмена предыдущих запросов (актуально для поиска, автодополнения).
  2. Гарантирует обработку только последнего значения (избегаем race condition).
  3. Чистый код — не нужно вручную отписываться от подписок.

Недостаток:
Не подходит, если нужно сохранять все вложенные Observable (например, для параллельных запросов). В таких случаях лучше mergeMap.

Ответ 18+ 🔞

А, ну вот, опять про этот ваш switchMap заговорили. Слушай, представь себе: ты стоишь на кухне, пытаешься чайник вскипятить, а тут тебе в голову приходит новая, блядь, гениальная идея — сварить кофе. Ты что делаешь? Правильно, чайник нахуй выключаешь и ставишь кофе варить. Потому что тебе сейчас нужен кофе, а не чай. Вот switchMap — это он и есть, такой вот кухонный диктатор.

Каждый раз, когда приходит новое значение снаружи (ну, там, пользователь букву в поиск вбил), он берет и говорит: «А ну нахуй всё предыдущее!» — и запускает новый внутренний поток. Старый запрос, старая подписка — всё к ебеням, в топку. Остается только последний, самый актуальный.

Вот смотри, как это в коде выглядит, тут всё честно:

input$.pipe(
  switchMap(value => http.get(`/api/search?q=${value}`))
).subscribe(results => console.log(results));

Пользователь печатает «к» — полетел запрос за «кот». Печатает «ко» — запрос за «котом» летит в пизду, а вместо него уже новый, за «котом и кошкой». Успел допечатать «котёнок» — и опять, блядь, всё старое отменилось, работает только поиск котят. Красота, ёпта! Утечек памяти нет, гонки запросов — тоже.

Чем он, сука, хорош:

  1. Сам всё отменяет, как будто у него совесть есть. Не надо руками unsubscribe городить.
  2. Гарантирует, что в итоге получишь результат только от последнего, самого свежего действия. Не будет такого, что ты «кошку» искал, а тебе вдруг результаты по «собаке» припёрлись, потому что старый запрос медленнее был.
  3. Код чистый, без этих вечных костылей с флагами и отписками. Просто взял и применил.

А где он, пидарас, не годится: Ну, а если тебе нужно, чтобы все запросы доходили до конца? Например, ты логгируешь действия пользователя, и каждый клик должен улететь на сервер, без разницы, какой был предыдущий. Или ты несколько параллельных операций запускаешь. Тут switchMap будет вести себя как последняя мразь — всё будет отменять. Для таких случаев есть mergeMap — он, сука, более терпимый, всех пускает и всех дожидается.

Короче, switchMap — это инструмент для жёсткого, последовательного контроля. Хочешь, чтобы только последнее имело значение — бери его. А если нужно всё и сразу — ищи другого, более либерального оператора.