在ReactiveUI 8.2中订阅ReactiveCommand的正确方法是什么

时间:2018-06-20 11:01:59

标签: reactive-programming reactiveui

我在ViewModel中有以下代码段。

 public ReactiveCommand<object, System.Reactive.Unit> LoadCustomerDetails;
ReactiveCommand<OrderViewPager<SalesOrderOrderOptionsEnum>, CommandSubmitResultDto<List<SalesOrderDto>>> _loadSalesOrderList;
public ReactiveCommand<OrderViewPager<SalesOrderOrderOptionsEnum>, CommandSubmitResultDto<List<SalesOrderDto>>> LoadSalesOrderList
{
    get { return _loadSalesOrderList; }
    private set { this.RaiseAndSetIfChanged(ref _loadSalesOrderList, value); }
}

 this.LoadSalesOrderList = ReactiveCommand.CreateFromTask<Pager<OrderOptionsEnum>, CommandSubmitResultDto<List<SalesOrderDto>>>(
                async filter =>
                {
                    Debug.WriteLine("Load SalesOrderList...");
                    Debug.WriteLine("Customer Id : " + SelectedCustomerId);
                    await LoadCustomerDetails.Execute();
                    var result = await SalesOrderMobApi.GetByCustomerTraderEntityIdPaged(SelectedCustomerId, filter, null, SalesOrderTypeEnum.SalesOrder, SalesOrderPOOptions.NotOriginatingFromPurchaseOrder);

                    return result;
                })
                .DisposeWith(ViewModelBindings.Value);

            this.LoadSalesOrderList.ThrownExceptions
                .Subscribe(ex =>
                {
                    Debug.WriteLine("Load SalesOrderList Failed!");
                });

            this.LoadSalesOrderList
               .ObserveOn(RxApp.MainThreadScheduler)
               .Subscribe(result =>
               {
                   if (result.PagingInfo.CurrentPage > 1)
                   {
                       foreach (var item in result.Data)
                       {
                           SalesOrdersList.Add(SalesOrderVMM.From(item));
                       }
                   }
                   else
                   {
                       SalesOrdersList.Clear();
                       foreach (var item in result.Data)
                       {
                           SalesOrdersList.Add(SalesOrderVMM.From(item));
                       }
                   }
               });

            LoadCustomerDetails = ReactiveCommand.CreateFromTask<object, System.Reactive.Unit>(
                async _ =>
                {
                    Debug.WriteLine(SelectedCustomerId);
                    var customers = await TraderEntityMobApi.GetById(SelectedCustomerId);
                    var customer = customers.Data;
                    SelectedCustomer = customer;
                    return System.Reactive.Unit.Default;
                }
                ).DisposeWith(ViewModelBindings.Value);

有时会给出如下异常。

    System.NullReferenceException: Object reference not set to an instance of an object.
    06-20 16:05:02.480 I/MonoDroid(15304):   at DistributrIII.Mobile.Lib.VM.SalesOrder.CreateSOListVM.<RegisterObservables>b__43_2 (System.Collections.Generic.List`1[T] result) [0x0000e] in C:\Users\gayanbu\Source\Repos\Distributr 3.0 UI\Mobile\DistributrIII.Mobile.Lib\VM\SalesOrder\CreateSOListVM.cs:131 .at System.Reactive.AnonymousSafeObserver`1[T].OnNext (T value) [0x0000a] in <99f8205c51c44bb480747b577b8001ff>:0 
06-20 16:05:02.480 I/MonoDroid(15304):   at System.Reactive.ScheduledObserver`1[T].Run (System.Object state, System.Action`1[T] recurse) [0x000f5] in <99f8205c51c44bb480747b577b8001ff>:0 
06-20 16:05:02.480 I/MonoDroid(15304):   at System.Reactive.Concurrency.Scheduler+<>c__DisplayClass49_0`1[TState].<InvokeRec1>b__0 (TState state1) [0x0001e] in <99f8205c51c44bb480747b577b8001ff>:0 
06-20 16:05:02.480 I/MonoDroid(15304):   at System.Reactive.Concurrency.Scheduler.InvokeRec1[TState] (System.Reactive.Concurrency.IScheduler scheduler, 

我猜想它试图在反应性命令LoadSalesOrderList中执行代码,即使结果为空。如何处理呢?有人可以解释一下订阅反应式命令的正确方法。我正在页面加载中以this.ViewModel.LoadSalesOrderList.Execute().subscribe(new Pager<OrderOptionsEnum>())的身份执行此命令 谢谢!

1 个答案:

答案 0 :(得分:0)

如果希望在ThrownExceptions中捕获引发异常时的命令,请执行Observable.Return(input).InvokeCommand(Command).DisposeWith(disposable)之类的命令,其中input是command的输入,Command是Command的名称