Angular 动态更改RxJS间隔

Angular 动态更改RxJS间隔,angular,rxjs,Angular,Rxjs,我有一个可观察的obs,间隔125*变量,每0.125秒完成一个动作。变量的值将在整个程序中动态变化 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 = thi

我有一个可观察的
obs
,间隔
125*变量
,每0.125秒完成一个动作。
变量的值
将在整个程序中动态变化

 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))
  );
obs=间隔(125*变量)。管道(
takeWhile(()=>this.t{
如果(!this.isPaused){
this.t.add(1,'minutes');this.time=this.t.format('LLL');
}
}),
地图(()=>时刻(本次))
);

如何更改可观测值的间隔以使用正确的/更新的
变量值?

因此,您的问题是,您不希望有固定的间隔,而是希望在每次发射后使用
125*变量重新开始

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

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

因此,您的问题是,您不希望有固定的间隔,而是希望在每次发射后都使用
125*变量重新开始

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

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

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

因为
“变量”
在整个程序中都在变化。因此,我们首先有一个BehaviorSubject,它将
的“变量”
包装为一个可观察的对象,BehaviorSubject将用于发出
变量的下一个值

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将处理它)。只订阅一次[无需重新订阅]

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

因为
“变量”
在整个程序中都在变化。因此,我们首先有一个BehaviorSubject,它将
的“变量”
包装为一个可观察的对象,BehaviorSubject将用于发出
变量的下一个值

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将处理它)。只订阅一次[无需重新订阅]

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

导出类AppComponent{
msgs=[];
MonitorDeviceInterval$=新行为主体(2000);//从2秒开始
恩戈尼尼特(){
此.msgs.push(“启动”);
这是monitorDeviceInterval$
.烟斗(
开关映射(值=>间隔(值)),
轻触(n=>{
this.msgs.push(“间隔刻度”+n.toString()+“”+this.monitordevicenterval$.getValue());
//使用新值更新间隔
this.monitorDeviceInterval$.next(this.monitorDeviceInterval$.getValue()+1000);
})
)      
.subscribe();
}
}

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

导出类AppComponent{
msgs=[];
MonitorDeviceInterval$=新行为主体(2000);//从2秒开始
恩戈尼尼特(){
此.msgs.push(“启动”);
这是monitorDeviceInterval$
.烟斗(
开关映射(值=>间隔(值)),
轻触(n=>{
this.msgs.push(“间隔刻度”+n.toString()+“”+this.monitordevicenterval$.getValue());
//使用新值更新间隔
this.monitorDeviceInterval$.next(this.monitorDeviceInterval$.getValue()+1000);
})
)      
.subscribe();
}
}

使用定时器而不是间隔,您将不需要拍摄(1)使用定时器而不是间隔,您将不需要拍摄(1)