Я создал ReactiveAsyncCommand (SL5) и не смог получить подписку для запуска метода OnError. Вот код
Start1Command = new ReactiveAsyncCommand();
Start1Command.RegisterAsyncObservable(_ => this.Start())
.Subscribe<int>(
u => Debug.WriteLine("OnNext-->" + u.ToString()),
ex => Debug.WriteLine("OnError-->" + ex.Message),
() => Debug.WriteLine("OnComplete-->")
);
Start1Command.Execute(null);
И код для запуска
public IObservable<int> Start()
{
return Observable.Start(() =>
{
throw new Exception("Exception");
return 42;
},
RxApp.TaskpoolScheduler);
}
Когда я запускаю этот код, я получаю исключение из инфраструктуры ReactiveUI, которое предлагает мне подписаться на ThrownExceptions. Когда я это сделаю, исключение, которое я выбрасываю выше, обрабатывается правильно.
Start1Command.ThrownExceptions.Subscribe(ex => Debug.WriteLine("ThrownExceptions OnNext-->" + ex.Message));
Должен ли я ожидать, что подписка на команды вызовет OnError? или мне нужно использовать ThrownExceptions.
1 ответ
Обычно ваши ожидания полностью оправдываются. Однако RegisterAsync*
эффективно перехватывает OnError
. Это упрощает программирование против RegisterAsync
, поскольку после того, как вы обработали OnError
один раз в Subscribe
, он больше никогда не будет работать. Обработка ThrownExceptions
означает, что вам не нужно заниматься повторной подпиской.
Если это не имеет смысла, не беспокойтесь об этом, просто обработайте ThrownExceptions
и предположите, что подписчик получает только OnNext
Похожие вопросы
Новые вопросы
reactiveui
ReactiveUI - это инфраструктура MVVM, которая интегрируется с Reactive Extensions