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

Я изучаю 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