RxJS: Operator switchMap
Opublikowano: 20.10.2022 - tagi: JavaScript RxJS Operator
Operator switchMap służy do pobrania danych ze źródła typu Observable.
To, co charakteryzuje switchMap, to możliwość anulowania emisji danych z poprzedniego wywołania. W momencie, gdy nasze źródło wysyła nowe dane poprzednia subskrypcja jest anulowana - pod warunkiem że nie zakończyła się w chwili emisji nowych danych.
W przeciwieństwie do operatora mergeMap switchMap pozwala na subskrypcję, w danej chwili tylko jednego źródła danych.
Za każdym razem, gdy wyślemy dane z podanego źródła poprzednia emisja, zostanie anulowana.
Jeśli zależy Ci na:
- Tylko jednej subskrypcji (w danym momencie) z obiektu typu Observable
- Na możliwości anulowania poprzedniej emisji danych
To użyj switchMap.
Przykłady
Przykład 1
import { fromEvent, interval } from 'rxjs';
import { switchMap } from 'rxjs/operators';
const interval$ = interval(1000);
const click$ = fromEvent(document, 'click');
click$
.pipe(
switchMap((e) => interval$)
)
.subscribe(console.log);
Wynik:
0
1
2
3
(kliknięcie)
0
1
2
...
Po kliknięciu przyciskiem myszy w stronę startuje licznik co sekundę, emitując nowe dane (interval$). Drugie kliknięcie powoduje anulowanie poprzedniej subskrypcji i start nowej.
Przykład 2
import { fromEvent } from 'rxjs';
import { ajax } from 'rxjs/ajax';
import { switchMap } from 'rxjs/operators';
const API_URL = 'https://jsonplaceholder.typicode.com/todos/';
const click$ = fromEvent(document, 'click');
click$
.pipe(
switchMap((e) => {
const id = parseInt(Math.random() * 20) + 1;
return ajax.getJSON(`${API_URL}/${id}`);
})
)
.subscribe(console.log);
Kliknij drugi raz odpowiednio szybko, zanim przyjdzie odpowiedź z pierwszego żądania — zostanie wysłane nowe zapytanie + anulowane zostanie poprzednie.