Угловая труба с удлиненным заданием - PullRequest
0 голосов
/ 05 ноября 2018

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

  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-запросов: enter image description here

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

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

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

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

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

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

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

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

0 голосов
/ 05 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...