动态更改 RxJS 间隔

Eth*_*etz 1 rxjs angular

我有一个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))
  );
Run Code Online (Sandbox Code Playgroud)

如何更改可观察值的间隔以使用正确/更新的variable值?

mar*_*tin 5

所以你的问题是你不想有固定的时间间隔,而是在每次发射之后重新开始125*variable

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

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


use*_*584 5

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

因为"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()
Run Code Online (Sandbox Code Playgroud)

有了这个将确保在发出每个新'variable'值时开始间隔(使用 125 * 变量),取消之前的间隔(switchMap 将处理它)。仅订阅一次【无需重新订阅】。