鐵人賽寫到後來覺得好偷懶,把Rx.net的內容拆到第四篇來講了,今天要來介紹雙事件流的情況。
假設我有一個投資帳戶,裡面具有一定數量的乙太幣,而虛擬貨幣的報價來源是以美元計價的,但我只想知道帳戶目前價值多少台幣。
首先我們會有兩個報價來源
IObservable<decimal> ETHPrice = // todo
IObservable<decimal> TWDETHRate = // todo
利用觀察者模式,在這邊我並不在意這兩個報價來源的實做,只把焦點放在如何結合這兩個報價,如果做成時序圖,我們可以想像兩個資料流,在不固定的時間我們會得到不同的報價
合併報價
Rx.net裡面有很多幫助我們結合報價的方法,在這邊會用到CombineLatest
,當兩個被觀察者其中一個發生新的事件,就可以用我們指定的方式結合到一條新的事件流。
var ETHPriceWithTWD = ETHPrice.CombineLatest(TWDETHRate, (price, rate) => price * rate);
採樣
事實上我們應該會希望設定一些篩選條件,而不是每次有新報價就要通知我,這時候可以設定每十分從採樣一次
// 採樣條件可以是一個被觀察者
var sample = Observable.Interval(TimeSpan.FromMinutes(10));
// 結合採樣條件
var source = ETHPriceWithTWD.Sample(sample);
設定目標價
我希望當價格低於35000TWD的時候自動買進,這時後用where過濾即可
source.where(price => price < 35000).Subscribe(BuyETH);
當遇到兩個事件來源的時候,就可以使用類似linq的方法將事件源結合在一起,這背後其實就是操作Monad的概念。Rx其實還可以用於連續事件的狀態傳遞,善加使用可以減少全域的狀態改變,但是需要對被觀察物件的生命週期有所掌握,可惜我還不是很懂XD,明天來講另一個過水的題目…延遲執行