我有一个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值?
所以你的问题是你不想有固定的时间间隔,而是在每次发射之后重新开始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)
另一个解决方案可能是这样的 -
因为"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 将处理它)。仅订阅一次【无需重新订阅】。
| 归档时间: |
|
| 查看次数: |
4155 次 |
| 最近记录: |