#angular #typescript
#angular #typescript
Вопрос:
У меня есть этот блок combineLatest, который запускает 2 http-запроса, но я хочу, чтобы второй запрос выполнялся только при выполнении определенного условия.
combineLatest([
this.leadsService.fetchALLLeadsActivityChart(this.clientId, this.getParams(optionsCurrent)),
this.leadsService.fetchALLLeadsActivityChart(this.clientId, this.getParams(optionsPrevious))]).pipe(takeUntil(this.chartSubscription)).subscribe(([current, previous]) => {
if(current.meta.success amp;amp; previous.meta.success){
this.processGraphData({current: current.results, previous: previous.results});
}
});
По сути, я хочу, чтобы второй leadsService запускался только в том случае, если
this.selectedDateFilter.enableComparisons = true;
Как мне поместить это в блок combineLatest? Или это должен быть отдельный вызов и просто сохранять результат первых запросов в переменной? Спасибо за помощь.
Комментарии:
1. почему бы вам не использовать эти http-вызовы в двух наблюдаемых, а затем вы можете легко контролировать, хотите ли вы их вызывать или нет.
2. Я хочу позволить this.processGraphData() подождать, прежде чем выполнять операции с результатом из блока combinelatest. может ли это сработать, если я разделю http-вызовы на две наблюдаемые?
3. ДА. http-запрос не выполняется, пока вы не подпишетесь, наблюдаемые не могут написать здесь код, поэтому я пишу его в комментарии
4. Я понимаю. Спасибо. Попробую.
Ответ №1:
Попробуйте что-то вроде этого
combineLatest([
this.leadsService.fetchALLLeadsActivityChart(this.clientId, this.getParams(optionsCurrent)),
this.leadsService.fetchALLLeadsActivityChart(this.clientId, this.getParams(optionsPrevious)),
])
.pipe(
takeUntil(this.chartSubscription),
filter(([current, previous]) => current.meta.success amp;amp; previous.meta.success),
switchMap(([current, previous]) => this.processGraphData({current: current.results, previous: previous.results}))
)
.subscribe((val) => console.log(val));
Ответ №2:
Выполняйте эти вызовы для отдельных наблюдаемых, а затем подписывайтесь на них с помощью combineLatest.
$o1 = this.leadsService.fetchALLLeadsActivityChart(this.clientId, this.getParams(optionsCurrent));
if(this.selectedDateFilter.enableComparisons == true) {
$o2 = this.leadsService.fetchALLLeadsActivityChart(this.clientId,
this.getParams(optionsPrevious));
}
combineLatest($o1, $o2).subscribe([current, previous]) => {
if(current.meta.success amp;amp; previous.meta.success){
this.processGraphData({current: current.results, previous: previous.results});
}
});