Как условно запустить http-запрос внутри combineLatest?

#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});
    } 
});