发生异常时将IObservable <bool>和IObservable <Exception>合并到一个可观察到的OnErrors - c#

我正在尝试创建一个单一的Observable,它的OnNext流来自一个可观察的,哪个OnError流来自另一个可观察的。

之所以这样做,是因为我试图包装一个我控制范围之外的类,并使用事件来传达其状态。它有两个事件,一个指示完成(布尔),另一个指示发生异常。

IObservable<Exception> error = Observable.FromEventPattern<ExceptionRoutedEventArgs>(foo, "Failed")
               .Select(x => x.EventArgs.ErrorException);

IObservable<bool> opened = Observable.FromEventPattern<RoutedEventArgs>(foo, "Opened")
               .Select(x => ((Bar)x.Sender).IsOpen);

现在,我不能使用标准的Observable.Merge,因为两个可观察值都有不同的通用参数。但是我想用伪代码来做到这一点:

Observable.Merge(opened, error, (op, err) =>
{
    if(op) { return op;}
    if(err != null){return Observable.Throw(err);}
}

现在,有很多原因使上面的代码与可能存在的任何内容不太相似,但我希望意图很清楚。

我认为实现此工作的一种方法是使用Subject ,但是我听说应该避免这样做,因为它在功能概念中引入了状态。而且我的想法是将两个可观察变量组合为一个可观察变量OnNext和OnError流似乎应该存在:)

参考方案

您可以使用Observable.Create

var combined = Observable.Create<bool>(o =>
{
    var openSub = opened.Subscribe(o);
    var errorSub = error.Subscribe(o.OnError);
    return new CompositeDisposable(openSub, errorSub);
});

或者,您可以将每个Exception投影到一个仅抛出错误的IObservable<bool>,然后合并结果序列:

var combined = opened.Merge(error.SelectMany(Observable.Throw<bool>));

尽管仅仅因为您的源使用Exceptions作为控制流并不意味着您必须-为什么不将Exception投影到false,那么成功则得到true而失败则得到false

var combined = opened.Merge(error.Select(_ => false));

Java中的<<或>>>是什么意思? - java

This question already has answers here: Closed 7 years ago. Possible Duplicate: What does >> and >>> mean in Java?我在一些Java代码中遇到了一些陌生的符号,尽管代码可以正确编译和运行,但对于括号在此代码中的作用却感…

菱形运算符<>是否等于<?> - java

我在util.TreeSet类中发现,其中一个构造函数正在使用具有空泛型类型的新TreeMap调用另一个构造函数。 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } new TreeMap<>是什么意思…

声纳测试用例失败 - java

我正在尝试为我的项目之一获得声纳报告。我已经运行mvn clean installRunning blah.blah.BlahTest1 Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec Running blah.blah.BlahTest2 Tests run…

休眠映射<键,设置<值>> - java

我有以下表格:@Entity @Table(name = "events") Event --id --name @Entity @Table(name = "state") State --id --name @Entity @Table(name = "action") Action --id …

如何使用BeautifulSoup在<tr>中捕获特定的<td> - python

尝试从nyc Wiki页面中的高中列表中获取所有高中名称。我已经写了足够多的脚本,可以让我获取包含在高中,学业和入学条件列表的表的<tr>标记中的所有信息-但是我如何才能缩小到我认为的范围内在td[0]内休息(会弹出KeyError)-只是学校的名称?到目前为止我写的代码:from bs4 import BeautifulSoup from ur…