[英]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.