#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 . Вам просто нужно заменить фиктивную наблюдаемую на вашу.