Чтобы проиллюстрировать более подробную информацию о том, что написал @Xinan, вы можете рассмотреть следующий пример, имитирующий вашу ситуацию
const action$ = new Subject<number>();
const ajax = (delay: number) => {
const ajax$ = new Subject<any>();
setTimeout(() => {
ajax$.next('delay ' + delay);
ajax$.complete();
}, delay);
return ajax$.asObservable();
};
action$
.pipe(
switchMap(delay => ajax(delay)), // delay 1001, delay 1002
// exhaustMap(delay => ajax(delay)), // delay 3000, delay 1002
)
.subscribe(console.log);
setTimeout(() => {action$.next(3000);}, 0); // action$ emission 1
setTimeout(() => {action$.next(1000);}, 1000); // action$ emission 2
setTimeout(() => {action$.next(1001);}, 1500); // action$ emission 3
setTimeout(() => {action$.next(1002);}, 3502); // action$ emission 4
Наблюдаемый action$
излучает 4 раза через 0, 1000, 1500 и 3502 миллисекунды соответственно.
Каждый раз, когда action$
излучает, мы создаем ajax
Observable, который сам будет излучать только один раз, после задержки, указанной в параметре action$
, а затем завершится.
Так, например, Наблюдаемая ajax
, созданная первым уведомлением о action$
(то есть action $ эмиссия 1 ), испустит через 3 секунды и завершится, в то время как вторая ajax
Наблюдаемые будут излучаться через 2 секунды (1 секунда из-за задержки action $ эмиссии 2 + 1 секунда из-за задержки, с которой ajax
излучает).
В этой симуляции, если вы используете switchMap
, на консоли вы увидите
delay 1001
delay 1002
Причина в том, что действие $ эмиссия 3 излучает, в то время как действие $ эмиссия 1 и действие $ эмиссии 2 все еще находятся на лету, и поэтому они завершены и отписался action $ эмиссии 3 по логике switchMap
. После выброса action $ эмиссии 4 других action $missions больше нет, и поэтому он может завершиться нормально, так что на консоли будет напечатано diplay 1002
.
Наоборот, если вы замените switchMap
на exaustMap
, вы получите
delay 3000
delay 1002
Причина - зеркало предыдущих рассуждений. действие $ эмиссия 2 и действие $ эмиссия 3 убиты, потому что действие $ эмиссия 1 все еще находится на лету.