Създаване на наблюдаема, която правилно изпраща грешки?

Уча 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;
    });

Правилно ли приемам, че и двата метода ще се държат по същия начин? Ако не, какви са разликите?


person Jeremy Durnell    schedule 16.02.2012    source източник


Отговори (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!"));
    });
person Ana Betts    schedule 16.02.2012