每次发生另一个事件时使用被动重新订阅

时间:2011-08-05 20:45:04

标签: c#-4.0 system.reactive

我想订阅一个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框架有更合适的方法吗?如果没有,我怎么能将这个模式包装成扩展名呢?

3 个答案:

答案 0 :(得分:2)

似乎你想要这样的东西:

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)。如果你有一个很好的名字来进行这个操作,那么很容易将这两个observable作为参数包装到一个方法中。

答案 1 :(得分:1)

我想我已经明白了:

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

答案 2 :(得分:0)

您是否尝试过以下操作:

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