RxJS v5可暂停观测间隔
在RxJS v5中没有实现RxJS v5可暂停观测间隔,rxjs,rxjs5,Rxjs,Rxjs5,在RxJS v5中没有实现pausable操作符的情况下,有没有更好的方法来创建可暂停的间隔?下面的代码起作用,但它是通过跟踪最后发出的值作为偏移量来实现的。看来应该有更好的办法 const source = Rx.Observable.interval(100).share() const offset = new Rx.BehaviorSubject(0) let subscription; let currentValue; function start() { subs
pausable
操作符的情况下,有没有更好的方法来创建可暂停的间隔?下面的代码起作用,但它是通过跟踪最后发出的值作为偏移量来实现的。看来应该有更好的办法
const source = Rx.Observable.interval(100).share()
const offset = new Rx.BehaviorSubject(0)
let subscription;
let currentValue;
function start() {
subscription = source
.subscribe(i => {
currentValue = i + offset.value
})
}
function pause() {
source.take(1).subscribe(i => offset.next(i + offset.value))
subscription.unsubscribe()
}
share()。refCount()。由于您正在从源代码处取消订阅,它将自行清理,然后在subscribe
d再次订阅时重新启动。将publish()
与connect()
一起使用。代码如下:
const source = Observable.interval(100).publish();
source.connect();
// Start with false, change to true after 200ms, then false again
// after another 200ms
const pauser = Observable.timer(200)
.mapTo(true)
.concat(Observable.timer(200).mapTo(false))
.startWith(false);
const pausable = pauser
.switchMap(paused => (paused ? Observable.never() : source))
.take(10);
pausable.subscribe(x => console.log(x));
请参阅此jsbin以获取运行示例:。没有通用的方法来实现这一点。这取决于你暂停的确切含义以及你暂停的内容。(您是否希望停止发射,然后重新开始,您是否缓冲和排放,或者您是否需要有效地向上游添加延迟,但以其他方式及时保持上游值的分布?)
我有一种有效的方法,当上游是一个定时器时,就像你的例子中那样。这就是我自己问题的答案
这种方法的最大优点是在时间上保留了源的值分布,但只是增加了延迟
对于更一般的情况:
对于冷观测:在从不
和上游之间切换
。暂停时,从上游取消订阅skip
您看到的,然后切换到skip
ed流。取消暂停时,您必须保持已发出值的计数,以便下次有人取消暂停时可以跳过该数值。你只需要记住你以前见过多少次。然而,每一次不暂停都会导致冷观测从一开始就重演。在一般情况下,这可能是非常低效的。代码看起来像这样<代码>暂停器
这里有一个主题,您可以将其设置为true或false以暂停上游
function pausableCold(pauser, upstream) {
var seen = 0;
return pauser.switch(paused => {
if (paused) {
return Observable.never();
}
else {
return upstream.skip(seen).do(() => seen++);
}
});
}
对于热观测或冷观测,可以使用缓冲<代码>缓冲区
暂停时,然后在未暂停时排放并浓缩到热上游。(这会保留所有值,但不会保留它们在时间上的分布。此外,如果可能是冷的,您应该使用publish
向上游加热。)
最有效的方法并不是真正的Rx的一部分。您真正想要的是告诉源停止发射,然后重新开始。您这样做的方式非常特定于源是什么以及源是如何生成值的
@cartant这很有帮助,但是源间隔在暂停时仍然会重置,所以就我所知,跟踪偏移值仍然是必要的。