我有一个可观察的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
值?
答案 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();
}
}