【问题标题】:pauseableBuffer with specific size?具有特定大小的可暂停缓冲区?
【发布时间】:2015-07-09 19:26:10
【问题描述】:

我怎样才能创建一个pausableBuffered observable,它只缓冲最新的项目?

目前我有一个丑陋的解决方法:

source.pauseableBuffered(pauser).debounce(0)

【问题讨论】:

    标签: javascript c# system.reactive rxjs


    【解决方案1】:

    你可以有两个可观察的序列 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 
    

    【讨论】:

    • 我认为不会解决 OPs 问题。如果ReplayWhere 之后,那么它将在暂停时删除所有值,并且仅在重新订阅时发出缓冲值。 OP 希望缓冲区仅保留暂停时发生的最新值,然后在恢复时发出该值
    • 用代码和结果更新了帖子。 OP 可以决定这是否符合要求?
    • 也许不是,我不确定这里是否满足 OP 的“特定尺寸”部分。但是,如果特定尺寸始终为 1,则成功。
    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多