Що робить mergeMap?Що робить mergeMap?
Коротко (як на співбесіді)
mergeMap - це оператор RxJS, який підписується на кожен inner Observable і виконує їх паралельно, об'єднуючи результати в один потік.
Він нічого не скасовує і не ставить у чергу.
Розгорнуто
mergeMap (він же flatMap) - це mapping-оператор, який:
- отримує значення з source Observable
- створює inner Observable
- підписується на всі inner Observable одночасно
- об'єднує їхні результати
Сигнатура:
source$.pipe(
mergeMap(value => observable$)
)Приклад
import { of } from 'rxjs';
import { delay, mergeMap } from 'rxjs/operators';
of(1, 2, 3).pipe(
mergeMap(v => of(v).pipe(delay(1000)))
).subscribe(console.log);Результат:
1
2
3Усі приходять приблизно одночасно через 1 секунду, бо виконуються паралельно.
Візуально
source: a----b----c
mergeMap:
inner a: -----
inner b: -----
inner c: -----
result: --- --- ---Коли використовують mergeMap
Коли:
- порядок не важливий
- операції незалежні
- потрібна паралельність
- операції не можна скасовувати
Angular-приклади:
- відправлення аналітики
- логування
- batch-запити
- завантаження кількох ресурсів
- background-операції
Наприклад:
from(ids).pipe(
mergeMap(id => this.api.loadUser(id))
)Завантаження підуть паралельно.
Важливий нюанс (часто запитують)
mergeMap може призвести до:
- race conditions
- перевантаження API
- витоків підписок
Тому іноді обмежують concurrency:
mergeMap(fn, 3)Не більше 3 активних Observable одночасно.
Відмінність від інших map-операторів
| Оператор | Поведінка |
|---|---|
| switchMap | скасовує попередній |
| concatMap | по черзі |
| mergeMap | паралельно |
| exhaustMap | ігнорує нові |
Це майже обов'язкова таблиця для Angular-співбесіди.
Типове follow-up запитання
Дуже люблять запитувати:
Чому mergeMap небезпечний для HTTP?
Відповідь: тому що можна запустити багато паралельних запитів, отримати гонку даних або перевантажити сервер.
Міні-шпаргалка для співбесіди
Можна запам'ятати так:
mergeMap - для незалежних операцій concatMap - коли важливий порядок switchMap - для запитів, які можна скасувати exhaustMap - для захисту від повторних дій
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.