Угловой оператор Rxjs takeWhile встречается только один раз

#angular #rxjs

#angular #rxjs

Вопрос:

Я пытаюсь продолжать отправлять запрос на сервер с задержкой, но когда я помещаю журнал консоли, я вижу, что это не происходит во второй раз.

Вот мой код:

 this.siteStatusMessage.pipe(
      map(messageData => JSON.parse(JSON.stringify(messageData))),
      takeWhile(() => this.isAlive),
      delay(3000)
    ).subscribe();
 

Что я делаю не так?

Комментарии:

1. Показать больше кода. Что такое наблюдаемое this.siteStatusMessage ? И где isAlive изменилось?

Ответ №1:

Насколько я понимаю, вы пытаетесь использовать delay(3000) для выполнения наблюдаемого каждые 3 секунды.

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

Чтобы выполнять наблюдаемое каждые 3 секунды, вам нужно использовать interval .

 interval(3000).pipe(
  switchMap((_) => this.siteStatusMessage.pipe(
      map(messageData => JSON.parse(JSON.stringify(messageData)))
  ),
  takeWhile(() => this.isAlive),
)
 

Ответ №2:

takeWhile принимает логическое значение, ваша функциональность выглядит так, как будто вы хотите использовать takeUntil(this.IsAlive) в этом случае IsAlive должен быть субъектом / Наблюдаемым уведомителем. Требование довольно расплывчатое, пожалуйста, предоставьте более подробную информацию.

Ответ №3:

Поскольку похоже, что вы хотите задержать запросы на 3 секунды каждый и продолжать выполнять их до тех пор, пока не установите для своего флага IsAlive значение false, вам было бы лучше использовать канал интервалов вместо delay .

Я скомпилировал здесь скрипт, с которым вы можете поиграть. В примере строка будет выдаваться каждые 3 секунды, пока флаг не станет false . Вам просто нужно заменить фиктивную наблюдаемую на вашу.