Цитирование learnrxjs"Однако будьте осторожны, вы, возможно, захотите избегать switchMap
в сценариях, где нужно выполнить каждый запрос".
"Основное различие между switchMap
и другими«Сглаживающие операторы - это эффект отмены», поэтому, когда selectedEntry$
имеет второе следующее значение, оно показывает ваше предыдущее значение.Наблюдаемый источник (this.selectedEntry$
) a; готово, подписка просто активна для Observable
, поступающего с этой строки:
return entry ? this.checkService.calculateLinesLength([entry.value]) : Observable.empty()
Итак, с учетом сказанного я рекомендую попробовать concatMap
вместо switchMap
:
subscribeLengthCalculator() {
this.subscriptions.add(
this.selectedEntry$
.concatMap((entry) => {
return entry ? this.checkService.calculateLinesLength([entry.value]) : Observable.empty();
}).subscribe(([calculation: CalculationObject]) => {
console.log(calculation);
this.calculation = calculation;
})
);
}
но на самом деле я люблю операторов конвейера, поэтому ответ будет:
import { concatMap } from 'rxjs/observable/concatMap';
subscribeLengthCalculator() {
this.subscriptions.add(
this.selectedEntry$
.pipe(
concatMap((entry) => {
return entry ? this.checkService.calculateLinesLength([entry.value]) : Observable.empty();
})
).subscribe(([calculation: CalculationObject]) => {
console.log(calculation);
this.calculation = calculation;
})
);
}