iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0

鐵人賽寫到後來覺得好偷懶,把Rx.net的內容拆到第四篇來講了,今天要來介紹雙事件流的情況。

對兩個數據來源進行合併

假設我有一個投資帳戶,裡面具有一定數量的乙太幣,而虛擬貨幣的報價來源是以美元計價的,但我只想知道帳戶目前價值多少台幣。

  1. 首先我們會有兩個報價來源

    IObservable<decimal> ETHPrice = // todo
    IObservable<decimal> TWDETHRate = // todo
    

    利用觀察者模式,在這邊我並不在意這兩個報價來源的實做,只把焦點放在如何結合這兩個報價,如果做成時序圖,我們可以想像兩個資料流,在不固定的時間我們會得到不同的報價

    https://ithelp.ithome.com.tw/upload/images/20221007/20148594rnpqOhzpvr.png

  2. 合併報價

    Rx.net裡面有很多幫助我們結合報價的方法,在這邊會用到CombineLatest,當兩個被觀察者其中一個發生新的事件,就可以用我們指定的方式結合到一條新的事件流。

    var ETHPriceWithTWD = ETHPrice.CombineLatest(TWDETHRate, (price, rate) => price * rate);
    
  3. 採樣

    事實上我們應該會希望設定一些篩選條件,而不是每次有新報價就要通知我,這時候可以設定每十分從採樣一次

    // 採樣條件可以是一個被觀察者
    var sample = Observable.Interval(TimeSpan.FromMinutes(10));
    // 結合採樣條件
    var source = ETHPriceWithTWD.Sample(sample);
    
  4. 設定目標價

    我希望當價格低於35000TWD的時候自動買進,這時後用where過濾即可

    source.where(price => price < 35000).Subscribe(BuyETH);
    

小結

當遇到兩個事件來源的時候,就可以使用類似linq的方法將事件源結合在一起,這背後其實就是操作Monad的概念。Rx其實還可以用於連續事件的狀態傳遞,善加使用可以減少全域的狀態改變,但是需要對被觀察物件的生命週期有所掌握,可惜我還不是很懂XD,明天來講另一個過水的題目…延遲執行


上一篇
Day25. Rx(3)
下一篇
Day27. Lazy Evaluation
系列文
Functional Programming with C#30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言