RX JS - Как повторить подписку через несколько периодов - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу повторять одну и ту же подписку на вызовы REST каждые 15000 мс (опрос). Я попробовал это:

foo() {
    return this.httpClient.get('/rest')
    .pipe(
      delay(15000),
      repeat(),
    );
}

//...
this.foo().subscribe(() => console.log('HEY'));

, который работает хорошо, за исключением того, что задерживает первый выброс после 15000 мс. Итак, как я могу получить тот же результат, не дожидаясь первой задержки?

Ответы [ 3 ]

2 голосов
/ 12 февраля 2020

Вы можете использовать вызов interval для создания наблюдаемой, которая многократно излучается после заданной задержки. Тогда вам нужно только mergeMap, что доступно для вашего сетевого вызова.

foo() {
    return interval(15000).pipe(
      mergeMap(() => this.httpClient.get('/rest')),
    );
}

//...
this.foo().subscribe(() => console.log('HEY'));
0 голосов
/ 12 февраля 2020

Не пробовал, но следующее должно работать.

Основное различие с другим ответом состоит в том, что будет ждать окончания запроса до sh, прежде чем ждать 15 секунд и снова опросить .

const mockRequest = () =>
  of("mockedRequest").pipe(
    // simulate network latency
    delay(500)
  );

const myRequest = () => {
  return mockRequest().pipe(
    switchMap(res =>
      concat(of(res), timer(DELAY_BETWEEN_REQUESTS).pipe(ignoreElements()))
    ),
    repeat()
  );
};

Демонстрационная версия: https://stackblitz.com/edit/rxjs-5fg2ov?file=index.ts

0 голосов
/ 12 февраля 2020

Вы можете сохранить значение для задержки в локальной переменной, которая инициализируется до 0, а затем обновляется после первого вызова.

foo() {
    let delayBy = 0;
    return this.httpClient.get('/rest')
    .pipe(
      delay(delayBy),
      tap(() => delayBy = 15000),
      repeat()
    );
}

Редактировать: предложение Брайана о таймере (0, 15000) лучше, чем это

...