我真的開始挖掘這個rx的東西......基本上,我跟着this video一起學習了一些關於ReactiveUI的知識,然後開始使用它真的!ReactiveUI 7.0如何處理拋出異常時處置的observables
我試圖創建一個情況,當我們使用WhenAnyValue來執行一個限制搜索你的類型。而且,如果搜索函數拋出一個異常,我想在視圖模型上設置一個名爲IsError
的屬性(這樣我可以顯示一個X或某個東西)。這是我工作的ViewModel的重要部分:
public ReactiveCommand<string, IEnumerable<DictItem>> SearchCmmand;
... in vm constructor:
//create our command async from task. executes on worker thread
SearchCmmand = ReactiveCommand.CreateFromTask<string, IEnumerable<DicItem>>(async x => {
this.IsError = false;
//this may throw an exception:
return await GetFilteredAsync(this.SearchText);
});
//SearchCommand is subscribable.
//set the Filtered Items property. executes on main thread
SearchCmmand.Subscribe(filteredItems => {
this.FilteredItems = filteredItems;
});
//any unhandled exceptions that are thown in SearchCommand will bubble up through the ThrownExceptions observable
SearchCmmand.ThrownExceptions.Subscribe(ex=> {
this.IsError = true;
//but after this, then the WhenAnyValue no longer continues to work.
//how to get it back?
});
//invoke the command when SearchText changes
this.WhenAnyValue(v => v.SearchText)
.Throttle(TimeSpan.FromMilliseconds(500))
.InvokeCommand(SearchCmmand);
而且這個工作。當我的GetFilteredAsync
引發異常時,SearchCmmand.ThrownExceptions
被調用,我可以設置我的IsError
屬性。
但是,當SearchCmmand.ThrownExceptions
第一次發生時,this.WhenAnyValue(v => v.SearchText)
停止工作。我可以看到它被丟棄。對SearchText的後續更改不會調用該命令。 (雖然命令仍然有效,如果我有一個按鈕綁定到它)
看來這是打算的行爲,但我們怎麼能得到可觀察的工作呢?我意識到我可以把它全部包裝在try/catch中,並返回一些非例外的東西,但是,我在video(約39:03)看到,在他的情況下,searchtext在拋出異常後繼續工作? (該vid的源代碼是here)。
我也看到here東西約UserError
,但現在標記爲遺產。