angular - почему наблюдаемая цепочка не заканчивается при передаче маршрута.parame через http.get с использованием switchMap
Почему первая цепочка не завершена?
SwitchMap должен отписаться от предыдущей наблюдаемой, и поскольку http.get является наблюдаемой один раз, я думал, что запись будет завершена.
Вместо этого я продолжаю получать результаты http.get. Это то, что я ожидал от flatMap.
this.route.params
.pipe(
switchMap(params => {
return this.http.get('assets/data/module.json');
})
)
.subscribe(
res => {
console.log(res);
},
e => e,
() => console.log('complete')
);
По умолчанию http.get приводит к завершению.
this.http.get('assets/data/module.json').subscribe(
res => {
console.log(res);
},
e => e,
() => console.log('complete')
);
1 ответ
Я думаю, что вы ошиблись в том, что switchMap
должен делать. switchMap
буду отписываться от внутреннего заметного (ваш http.get
вызов), если выдается новый параметр. Он не будет отписываться от параметров, как только ваш http.get
звонок закончен.
То, что вы хотите, это добавить first()
оператор в вашей трубе перед вашим оператором switchMap. Также вы можете использовать mergeMap вместо switchMap, хотя это не должно иметь значения в вашем случае.
this.route.params
.pipe(
first(),
switchMap(params => {
return this.http.get('assets/data/module.json');
})
)
.subscribe(
res => {
console.log(res);
},
e => e,
() => console.log('complete')
);
Это примет первый параметр, испускаемый route.params
, введите ваш http запрос и затем заполните наблюдаемое.
Пример того, как можно использовать карту переключателей: допустим, у нас есть поле поиска, в которое я могу ввести что угодно. Когда я ввожу что-то в поле поиска, angular вызывает бэкэнд для получения результата поиска. Теперь может случиться так, что я изменю свой поисковый запрос, пока последний поисковый запрос еще не завершен В этом случае switchMap отменит старый запрос get и выдаст новый.