iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0

昨天的範例將資料序列與非同步作業結合,但Rx可以結合事件驅動,我想要把準備好的名單換掉,改成由Console視窗決定資料來源,首先要準備好Observalbe來觀察輸入資料

var input = Observable.Create<string>(o =>
{
    Input(Console.ReadLine()!);

    return Disposable.Empty;

    void Input(string s)
    {
        if (s == "q") o.OnCompleted();
        else
        {
            o.OnNext(s);
            Test(Console.ReadLine()!);
        }
    }
});

在這邊設計了Input方法,如果輸入值s不為”q”的話就會將s作為後續觀察物件OnNext方法的輸入值,並且遞迴呼叫,這樣就設計好資料來源了,接下來就是結合非同步查詢的部份

(from a in ar 
 from s in GetRoleAsync(a)
 select s).Subscribe(Console.WriteLine);

// input : "洛伊得"
// output: "黃昏"
// input : "約兒"
// output: "睡美人"

比較數據來源

為了更好掌握Reactive的特性,我們來比較一下昨天名單與今天輸入值的差別

  • 可迭代的名單

https://ithelp.ithome.com.tw/upload/images/20221006/201485942wcFwMmVn1.png

  • Console input

https://ithelp.ithome.com.tw/upload/images/20221006/20148594rNq95IH3Pj.png

改成由Console視窗輸入查詢值的樣子,是不是比較能體會到Reactive響應式的特性呢?針對每次資料來源的輸入就可以個別查詢結果。將需要觀察資料源製作成可觀察的物件,利用monad可組合的特性,就能夠想像將各種操作組合成單一的Observerable物件並訂閱事件!

小結

今天介紹了針對不固定的數據來源進行訂閱。明天要介紹如何觀察兩個數據來源的情況,透過Rx.net可以將兩個需要被觀察的事件流和二為一!


上一篇
Day24. Rx(2)
下一篇
Day26. Rx(4)
系列文
Functional Programming with C#30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言