动态更改RxJS间隔

时间:2019-06-07 21:25:11

标签: angular rxjs

我有一个可观察的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值?

3 个答案:

答案 0 :(得分:1)

因此,您的问题是您不希望有固定的间隔,而是在每次发射都以125*variable开始之后。

您可以将interval()包装在defer()内,并在每次发射后重新订阅以触发其回调。这意味着在每次发射之后,interval可观测对象将完成,repeat()将立即重新订阅它:

const obs = defer(() => interval(125 * variable)).pipe(
  take(1),
  repeat(),
  takeWhile(...),
  tap(...),
  map(...)
);

答案 1 :(得分:1)

另一个解决方案可能是这样-

因为"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()

有了此设置,将确保在发射每个新的'variable'值时开始您的间隔(带有125 *变量),取消先前的间隔(switchMap将处理该间隔)。只需订阅一次[无需重新订阅]。

答案 2 :(得分:0)

解决类似问题的另一种方法。 在按时间间隔调用的任务内部动态更改时间间隔值。

export class AppComponent {
  msgs = [];
  monitorDevInterval$ = new BehaviorSubject<number>(2000); // start with 2 sec

  ngOnInit() {
    this.msgs.push("Starting");

    this.monitorDevInterval$
      .pipe(
        switchMap( value => interval( value ) ), 
        tap(n => {
          this.msgs.push("Interval tick " + n.toString() + ' ' +  this.monitorDevInterval$.getValue());
          // Update interval with new value
          this.monitorDevInterval$.next( this.monitorDevInterval$.getValue() + 1000 );
        })
      )      
      .subscribe();
  }
}