Що робить exhaustMap?
Останній оператор з «великої четвірки» map-операторів RxJS.
Коротко (як на співбесіді)
exhaustMap - це оператор RxJS, який ігнорує нові значення, поки поточний inner Observable не завершиться.
Використовується для захисту від повторних дій користувача (наприклад, подвійний клік).
Розгорнуто
exhaustMap працює так:
- приходить значення з source Observable
- створюється inner Observable
- поки він виконується, усі нові значення ігноруються
- після завершення можна прийняти наступне значення
Приклад
import { fromEvent } from 'rxjs';
import { exhaustMap } from 'rxjs/operators';
fromEvent(button, 'click').pipe(
exhaustMap(() => this.http.post('/save', data))
).subscribe();Якщо користувач клікає:
click click click click
то виконається лише один HTTP-запит, решта ігноруються.
Візуально
source: a----b----c
exhaustMap:
inner a: ----------
b ignored
c ignored
result: ----------Коли використовують exhaustMap
Дуже типові Angular-кейси:
- submit форми
- login
- оплата
- запобігання double-click
- захист від повторних HTTP-запитів
Наприклад:
this.loginClicks$.pipe(
exhaustMap(() => this.authService.login())
)Відмінність від інших map-операторів
Це майже обов'язкове питання на Angular-співбесіді.
| Оператор | Поведінка |
|---|---|
| switchMap | скасовує попередній |
| concatMap | черга |
| mergeMap | паралельно |
| exhaustMap | ігнорує нові |
Важливий нюанс
exhaustMap не скасовує поточну операцію, він просто ігнорує нові.
Це головна відмінність від switchMap.
Типове follow-up запитання
Дуже часто запитують:
switchMap vs exhaustMap?
Коротка відповідь:
- switchMap → скасовує попередній
- exhaustMap → ігнорує нові
Реальний Angular-кейс
fromEvent(button, 'click').pipe(
exhaustMap(() => this.api.save())
)Захищає від:
- double submit
- duplicate requests
- accidental clicks
Міні-шпаргалка по map-операторах
На співбесіді можна відповісти так:
switchMap - перемикається concatMap - черга mergeMap - паралельно exhaustMap - ігнорує
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.