Повторите или перезапустите наблюдаемый (интервал) после его завершения - PullRequest
0 голосов
/ 13 апреля 2020

Вот то, что я пытаюсь сделать - с шагом 3 я борюсь.

  1. Установка пользовательского интервала
  2. запускает вызов http (подписаться на него)
  3. Как только интервал закончится, я хочу бесконечно повторять вышеуказанные шаги (до тех пор, пока не будет выполнено условие)

Шаги № 1 и № 2 работают

setRenewalInterval() {
  ...

  return this.timerSub = interval(CUSTOM_INTERVAL * 1000)
    .pipe(
      take(1),
      map(x => {
        if (this.isLoggedIn && !tokenHelper.isTokenExpired()) {
          console.log("<Requesting Token Renew>")
          this.getNewToken().subscribe(
            x => {
              console.log("<Token renewed successfully>");
            },
            err => {
              console.log("<Token failed to renew>");
              this.setLogOut();
            },
            () => console.log('<renewal observable completed>')
          );
        }
        else {
          console.log("<Not Logged in or Token expired; logging out>");
          this.setLogOut();
        }
      })   
    )
    .subscribe();
 }

# 3 повторите вышеуказанные шаги после завершения подписки. Либо позвоните по номеру setRenewalInterval(), либо лучше сделать это внутри setRenewalInterval().

Я изучил rx js repeat() и expand(), но я не могу заставить их работать с приведенным выше кодом. Любая помощь приветствуется, особенно тестируемый / запускаемый код, например, jsfiddle.

1 Ответ

0 голосов
/ 13 апреля 2020

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

Если вы удалите take(1) ваш код внутри map будет вызываться с вашим интервалом навсегда.

map - это полезная функция, когда вы хотите взять значения, излучаемые в наблюдаемой, и преобразовать их в новое значение синхронно, подобно тому, как Array.map() работает. Поскольку вы работаете с наблюдаемыми внутри этой карты, мы можем использовать что-то вроде mergeMap(), которое будет автоматически обрабатывать подписку и передачу значений.

setRenewalInterval() {
  // ...
  return this.timerSub = interval(CUSTOM_INTERVAL * 1000)
    .pipe(
      mergeMap(() => {
        if (this.isLoggedIn && !tokenHelper.isTokenExpired()) {
          return this.getNewToken();
        } else {
          return this.setLogOut();
        }
      })   
    )
    .subscribe(x => {
      // x is the result of every call to getNewToken() or setLogOut()
    });
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...