鉴于这段代码:
var loadAll =
Observable.ForkJoin(
service1.FindBooksAsObservable().Select(s => s),
service2.FindBooksAsObservable().Select(s => s),
service3.FindBooksAsObservable().Select(s => s)
);
loadAll.Subscribe(
result =>
{
var aggregatedListOfBooks = result.SelectMany(b => b);
});
正如您所看到的,问题是每个 FindBooksAsObservable()方法返回IObservable<IEnumerable<Book>>
,因此结果变量在订阅()中是IEnumerable<Book>
的数组。
是否有其他方法可以聚合 ForkJoin()的结果?我希望使用像 Merge()这样的东西和ForkJoin。
答案 0 :(得分:4)
假设所有三个服务都返回Books
列表,您可以使用SelectMany
合并列表:
IObservable<Book> loadAll =
Observable.ForkJoin(
service1.FindBooksAsObservable().Select(s => s),
service2.FindBooksAsObservable().Select(s => s),
service3.FindBooksAsObservable().Select(s => s)
)
.Select(books => books.SelectMany(list => list).ToList());
loadAll.Subscribe(
book => { /* will be called once with a single list of all items */ });
如果您不要求输出为列表,则可以删除ToList()
来电。
答案 1 :(得分:0)
Observable.ForkJoin
不在最新稳定版本的Reactive Extensions(Rx)(v2.1.30214.0)上。截至2013年6月的ForkJoin仅在Rx的实验版本中。
Dave Sexton提出了一个解决方案: http://social.msdn.microsoft.com/Forums/en-US/rx/thread/3cfccb74-9ce3-47dc-94fd-cf60270c1ed5