Rx.Net:在SelectMany中调用多个IObservable [英] Rx.Net : Calling multiple IObservable in SelectMany
问题描述
请注意:这是问题较早发布,但感兴趣的解决方案却有不同的情况.
Please Note: This is continuation of the question posted earlier but the solution of interest is of a different situation.
我试图多次调用各自返回IObservable的方法,但在SelectMany语句中返回的值是一个Task,因此下面的Subscribe语句无法编译.
I am trying to make multiple calls to the methods that each return IObservable but the values being returned back in the SelectMany statement is a Task and hence the following Subscribe statement does not compile.
这是代码段
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
.试试这个:
You just want to use .SelectMany
. Try this:
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
在对上一个问题的评论中,我建议将此作为代表列表进行.方法如下:
In the comments on your previous question I suggested doing this as a list of delegates. Here's how:
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;
您得到相同的结果.
这篇关于Rx.Net:在SelectMany中调用多个IObservable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!