我正在学习Rx并正在研究一些语义。作为一个实验,我正在构建一个可观察的计时器,它在第十个刻度上调用OnError。到目前为止,我认为有2种方法表现出相同的行为:
var timer = Observable.Interval(TimeSpan.FromMilliseconds(200));
// method 1
Observable.Create<long>(
x => timer.Subscribe(tick => {
if (tick == 10)
{
x.OnError(new Exception());
}
x.OnNext(tick);
}));
// method 2
timer.Select(x => {
if (x == 10)
{
throw new Exception();
}
return x;
});
假设这两种方法的行为完全相同,我是否正确?如果没有,有什么区别?
答案 0 :(得分:1)
第二种方式是不等效,投掷选择器导致可能发生的未定义行为看起来相同。以下是其他几种方式:
Observable.Interval(TimeSpan.FromMilliseconds(200))
.Take(9)
.Concat(Observable.Throw<long>(new Exception("Die!")));
Observable.Interval(TimeSpan.FromMilliseconds(200))
.SelectMany(x => {
if (x < 10) return Observable.Return(x);
return Observable.Throw<long>(new Exception("Die!"));
});