在Rx中聚合ForkJoin的结果

时间:2010-12-08 11:12:20

标签: .net system.reactive reactive-programming

鉴于这段代码:

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。

2 个答案:

答案 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