Угловая интервальная труба с более длинным заданием внутри

У меня есть этот код внутри моего компонента:

  ngOnInit() {
    ...
    this.counterValue$ = interval(1000).pipe(
      switchMap(() => this.perfService.getCounter(this.counterUrl)),
      map(i => this.updateChart(i)),
    );
    this.counterValue$.subscribe(v => console.log(v));
  }

Я написал это, чтобы обновлять диаграмму каждые 1 с. Проблема в том, что для возврата perfService.getCounter() требуется более 1 с. И это приводит к отмене следующих HTTP-запросов: введите здесь описание изображения

как это исправить?


person Obay Abd-Algader    schedule 05.11.2018    source источник
comment
попробуйте использовать mergeMap вместо switchMap   -  person iofjuupasli    schedule 05.11.2018


Ответы (2)


Если вы хотите обновлять его каждые 1 с, в то время как большая часть запроса занимает более 1 с, правильный оператор для вас, вероятно, exhaustMap.

Краткое резюме, каковы различия между другими операторами *map в этом случае:

  • switchMap будет отменять ожидающий запрос на каждую эмиссию от interval(1000).

  • mergeMap будет делать новый запрос для каждого выпуска от interval(1000), поэтому у вас будет много ожидающих запросов одновременно, а затем переопределять их ответы по мере их поступления.

  • concatMap будет складывать входящие выбросы от interval(1000), а затем выполнять их по мере их завершения, поэтому, если у вас есть период очень медленных ответов, а затем очень быстрых ответов, concatMap будет отправлять запросы чаще, чем через 1 с, потому что сначала он очистит свой внутренний буфер. .

  • exhaustMap сделает запрос, а затем проигнорирует любую последующую передачу от interval(1000), пока его внутренний запрос не завершится. Неважно, сколько времени это займет. Затем он будет ждать другого выброса из исходного Observable. Таким образом, вы гарантированно будете иметь задержки не менее 1 с, не создавая перекрывающихся запросов.

person martin    schedule 05.11.2018
comment
Спасибо :) Это многое объясняет - person Obay Abd-Algader; 05.11.2018

SwitchMap отменяет событие, если приближается другое новое событие. Вы пытались использовать оператор tap?

person Alejandro Lora    schedule 05.11.2018