簡體   English   中英

Rx.Net:在 SelectMany 中調用多個 IObservable

[英]Rx.Net : Calling multiple IObservable in SelectMany

請注意:這是之前發布的問題的延續,但感興趣的解決方案是不同的情況。

我正在嘗試對每個返回 IObservable 但在 SelectMany 語句中返回的值是一個 Task 的方法進行多次調用,因此以下 Subscribe 語句無法編譯

這是代碼片段

 var myWorkList = new List<MyWork>
                {
                    new MyWork(),// MyWork.Execute(data) returns IObservable
                    new MyWork()
                }.ToObservable();

 var results =
   myService
    .GetData(accountId)
    .SelectMany(data => myWorkList.ForEachAsync(r => r.Execute(data))
    .Subscribe(result =>
    {
        Console.WriteLine($"Result Id: {result.Id}");
        Console.WriteLine($"Result Status: {result.Pass}");
    });

您只想使用.SelectMany 嘗試這個:

var myWorkList = new List<MyWork>()
{
    new MyWork(),
    new MyWork()
}.ToObservable();

var query =
    from data in myService.GetData(accountId)
    from myWork in myWorkList
    from result in myWork.Execute(data)
    select result;

var results =
    query
        .Subscribe(result =>
        {
            Console.WriteLine($"Result Id: {result.Id}");
            Console.WriteLine($"Result Status: {result.Pass}");
        });

這是我的測試代碼:

public static class myService
{
    public static IObservable<MyData> GetData(int x)
        => Observable.Return(new MyData());
}

public class MyWork
{
    public virtual IObservable<MyResult> Execute(MyData data)
    {
        return
            from isMatch in IsMatch(data)
            where isMatch
            select new MyResult() { Id = 1, Pass = true };
    }

    public IObservable<bool> IsMatch(MyData data)
    {
        return Observable.Return(true);
    }
}

public class MyResult
{
    public int Id;
    public bool Pass;
}

public class MyData { }

當我執行時,我得到了這個:

Result Id: 1
Result Status: True
Result Id: 1
Result Status: True

在對您之前的問題的評論中,我建議將其作為代表列表進行。 就是這樣:

var myWorkList = new Func<MyData, IObservable<MyResult>>[]
{
    md => new MyWork().Execute(md),
    md => new MyWork().Execute(md),
}.ToObservable();

var query =
    from data in myService.GetData(accountId)
    from myWork in myWorkList
    from result in myWork(data)
    select result;

你得到相同的結果。

該列表可以聲明為MyWork -s 的列表 - 此處不使用ToObservable

var myWorkList = new List<MyWork>
            {
                new MyWork(),// MyWork.Execute(data) returns IObservable
                new MyWork()
            };

然后,我們將myService.GetData返回的對象映射到myWorkList的元素上,並將它們作為IObservable -s。

var observables = myService
         .GetData(accountId)
         .SelectMany(data => myWorkList.Select(r => r.Execute(data)));

現在你可以觀察它們了。

一起 - 合並:

var subscription =
          observables
           .Merge()
           .Subscribe(result =>
           {
               ...
           });

或單獨:

var subscriptions=
          observables
           .Select(obs => 
               obs.Subscribe(result =>
               {
                   ...
               }))
           .ToArray();

更新:后一種情況必須立即實現以防止副作用 (.ToArray())。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM