RxJs

Differences between map, switchMap, flatMap, concatMap, exhaustMap

Screenshot 2025-09-05 at 16.18.39.png

Map

foo$ = from([1,2,3,4,5]).pipe(map(item => item * 10));
foo$.subscribe(console.log); // 10,20,30,40,50
Multi-column

Example function

const example = (operator: any) => () => {
	from([0,1,2,3,4,5])
		.pipe(operator((x: any) => of(x).pipe(delay(500))))
		.subscribe(
			console.log,
			() => {},
			() => console.log(`${operator.name} completed`)
		);
};

example(mergeMap)();

Merge Map (Flat Map)

Screenshot 2025-09-06 at 11.05.35.png

Creates new observable for each element, and subscribe to it imediately. Because of delay(500) all items will be returned one by one but at the same time after 500ms.

Concat Map

Screenshot 2025-09-06 at 11.05.59.png

In this case each sub observable will return item after previous observable finish, so each item will be returned with 500ms delay between them.

concatMap wait for the previous observable to be completed. Next observable won't be created until previous observable completes.

Example:
When need to wait for first observable ie. getUser(1) to retrieve user details ie. getUserDetails.

Switch Map

Screenshot 2025-09-06 at 11.05.44.png

switchMap cancels every previous observables.

Exhaust Map

Screenshot 2025-09-06 at 11.05.49.png

exhaustMap will ignore next observables until current observable is completed.