大多數(如果不是全部)例子在線註冊處理程序,但返回一個離散的可觀察值(即Observable.Return(RecoveryOptionResult.CancelOperation)
)。爲了正確實現,最好將RecoveryOptions
列表作爲按鈕列表(或類似的東西)呈現給用戶,並將流量控制傳遞給用戶。如何異步使用UserError處理程序
什麼我掙扎是如何等待用戶(或者更具體地說,如何等待RecoveryOption
命令之一,有其RecoveryResult
設置)按鈕點擊。
我設法一起破解的東西確實這個,但我無法想象這種方式是正確的。我缺乏使用reactiveui的經驗,使我無法概念化監控ReactiveList<IRecoveryCommand>
的正確方法。
下面是我的黑客代碼。
// UserError.RegisterHandler(x => HandleErrorAsync(x));
private async Task<RecoveryOptionResult> HandleErrorAsync(UserError error)
{
// present error UI...
// use ReactiveCommand's IsExecuting observable to monitor changes (since RecoverResult is not an observable)
// is there a better way to do this??? this seems sub-optimal
await error.RecoveryOptions
.Select(x => x.IsExecuting)
.Merge()
.Where(_ => error.RecoveryOptions.Any(x => x.RecoveryResult.HasValue))
.FirstAsync();
// recovery option was clicked in the UI
// get the recovery option that was chosen
return error.RecoveryOptions
.Where(x => x.RecoveryResult.HasValue)
.Select(x => x.RecoveryResult.Value)
.First();
}
的主要問題是,RecoveryResult
不觀察到。所以我必須監測IsExecuting
那是觀察,然後檢查RecoveryResult
值。然而,似乎必須有更好的方法來做到這一點。