【发布时间】:2015-07-09 19:26:10
【问题描述】:
我怎样才能创建一个pausableBuffered observable,它只缓冲最新的项目?
目前我有一个丑陋的解决方法:
source.pauseableBuffered(pauser).debounce(0)
【问题讨论】:
标签: javascript c# system.reactive rxjs
我怎样才能创建一个pausableBuffered observable,它只缓冲最新的项目?
目前我有一个丑陋的解决方法:
source.pauseableBuffered(pauser).debounce(0)
【问题讨论】:
标签: javascript c# system.reactive rxjs
你可以有两个可观察的序列
1.source序列
2.pauser序列IObservable<bool>
那么你可以结合最新的它们
Observable.CombineLatest(
source,
pauser,
(s,p)=>Tuple.Create(s,p))
.Where(t=>!t.Item2)
这现在允许您在 pauser 推送一个“真”值时忽略值。
然后您可以简单地在其末尾粘贴 replay(1)。
Observable.CombineLatest(
source,
pauser,
(s,p)=>Tuple.Create(s,p))
.Where(t=>!t.Item2)
.Replay(1)
//.Publish().RefCount(); //If required.
编辑
Replay(1) 只是噪音,并不关注 OP。
这段代码
var source = new Subject<int>();
var pauser = new Subject<bool>();
var query = Observable.CombineLatest(source, pauser, (s,p)=>Tuple.Create(s,p))
.Where(t=>!t.Item2);
query.Dump();
pauser.OnNext(false);
source.OnNext(1);
source.OnNext(2);
source.OnNext(3);
pauser.OnNext(true);
source.OnNext(4);
source.OnNext(5);
source.OnNext(6);
pauser.OnNext(false);
source.OnNext(7);
source.OnNext(8);
产生这个结果
1
2
3
6
7
8
【讨论】:
Replay 在Where 之后,那么它将在暂停时删除所有值,并且仅在重新订阅时发出缓冲值。 OP 希望缓冲区仅保留暂停时发生的最新值,然后在恢复时发出该值