Динамически изменить интервал RxJS - PullRequest
0 голосов
/ 08 июня 2019

У меня есть наблюдаемое obs с интервалом 125*variable, которое завершает действие каждые 0,125 секунды. Значение variable будет динамически меняться во всей моей программе.

 obs = interval(125*variable).pipe(
    takeWhile(() => this.t < moment('2019-04-16T18:00:00')),
    tap(() => {
      if (!this.isPaused) {
        this.t.add(1, 'minutes'); this.time = this.t.format('LLL');
      }
    }),
    map(() => moment(this.time))
  );

Как я могу изменить интервал моей наблюдаемой, чтобы использовать правильное / обновленное variable значение?

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Другое решение может быть таким -

Потому что "variable" меняется по всей программе. Итак, у нас сначала есть BehaviorSubject, который обернет "variable" как наблюдаемый, и BehaviorSubject будет использоваться для выдачи следующего значения для variable -

const variable$ = new BehaviorSubject(1); //you can set initial value as per your need

updateVariable(newValue) {
  this.variable$.next(newValue);
}

this.variable$.pipe(
  switchMap(val => interval(125 * val),
  //now apply your various operators chain as per your need
  takeWhile(),...
  tap(),...
  map()...
).subscribe()

Наличие этого параметра обеспечит запуск вашего интервала (с переменной 125 *) для эмиссии каждого нового значения 'variable', отменяя предыдущий интервал (switchMap позаботится об этом). Подпишитесь только один раз [нет необходимости повторной подписки].

1 голос
/ 08 июня 2019

Итак, ваша проблема в том, что вы не хотите иметь фиксированный интервал, а после того, как каждая эмиссия начинается с 125*variable.

. Вы можете заключить interval() в defer() и подписываться после каждогоэмиссия, чтобы вызвать его обратный вызов.Это означает, что после каждой эмиссии interval Observable завершается и repeat() немедленно повторно подписывается на нее:

const obs = defer(() => interval(125 * variable)).pipe(
  take(1),
  repeat(),
  takeWhile(...),
  tap(...),
  map(...)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...