【问题标题】:Using reactive to resubscribe each time another event occurs每次发生另一个事件时使用响应式重新订阅
【发布时间】:2011-08-05 20:45:03
【问题描述】:

我想订阅一个 observable,但只运行一次操作,直到另一个 IObservable 触发。每次其他 IObservable 触发时,我都希望重新订阅并运行一次我的操作。下面的代码应该可以做到这一点:

Action<object> act = null;
act = _ => {
    DoThis();
    obj.Observable1.SkipUntil(obj.CompletedObservable).Take(1).Subscribe(act);
};
obj.Observable1.Take(1).Subscribe(act);

有没有更合适的方法来使用 Rx 框架来做到这一点?如果没有,我怎么能把这个模式包装成一个扩展?

【问题讨论】:

    标签: c#-4.0 system.reactive


    【解决方案1】:

    您似乎想要这样的东西:

    first  -----1------------2-------------3--4--------->
                |            |             |  |
    second ---------A--B----------C-D-E-----------F---G->
                    |             |               |
    final  ---------A-------------C---------------F----- >
    

    为此,SelectManyTakeTakeUntil 的组合应该可以工作。我会说:

    var final = from f in first
                from s in second.Take(1).TakeUntil(first)
                select s;
    

    .Take(1) 确保您只获得第一个项目之后的第一个项目(对于 1、2 和 4)。 .TakeUntil(first) 涵盖 3,因此 F 只通过一次(到 4)。如果你给这个操作起一个好听的名字,就可以很容易地包装成一个以两个 observables 作为参数的方法。

    【讨论】:

    • 很好的解决方案。该图是我应该包括的。
    【解决方案2】:

    我想我明白了:

    obj
        .CompletedObservable
        .StartWith(/* value of suitable type for CompletedObservable */)
        .Select(x => obj.Observable1.Take(1))
        .Switch()
        .Subscribe(x => DoThis());
    

    【讨论】:

    • StartWith 使它成为一个完美的解决方案。谢谢!
    【解决方案3】:

    您是否尝试过以下方法:

    obj.CompletedObservable
        .Select(_ => obj.Observable1.Next().First())
        .Subscribe(_ => DoThis());
    

    【讨论】:

    • 请注意,您似乎没有使用任何一个 observable 中的任何元素 - 在这种情况下,也许 .Zip ping 两个集合都会这样做,除非 Observable1 很少触发并且您想等待下一个.
    • 不幸的是,必须在 CompletedObservable 触发之前处理 Observable1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多