2016-02-11 29 views
2

我有问题。有没有像RxJava中的Promise.all()方法?

我需要通过项目id的列表来获取一些项目的列表。 起初,我试图

Observable.from(itemIds) 
    .flatMap(itemId -> requestToServer(itemId)) 
    .subscribe(item -> { /* do something */ }); 

但运营商flatMap并不能保证项目的顺序。 我需要得到的项目为ItemIds

如果有像Promise.all()这样的api,那将会很棒。 RxJava中有没有类似Promise.all()的方法?或者其他方式?

回答

0

改为使用concatMap。这将串连为了发出观测量,而不是合并它们的排放

返回一个新的可观察到发射从应用 功能导致你提供给由源 观察的,如该函数返回一个发出的每一个项目的项目可观察的,然后发射由结果得到的结果产生的项目 可观测量。

+0

是的,但是'concatMap'处理请求一个一个。 我想要做的是所有的请求都是并发的,但是所有的响应都是按顺序的。作为'Promise.all()'做。 – chooblarin

+0

也许这篇文章会有帮助吗?虽然没有尝试过这个技巧,但是''concatMap',所以不确定:http://tomstechnicalblog.blogspot.com/2015/11/rxjava-achieving-parallelization.html –

+0

我找到'concatMapEager'运算符。也许,这是我需要的。谢谢! – chooblarin

4

这听起来像你正在寻找的Zip operator

例如:

Observable<Integer> obs1 = Observable.just(1); 
Observable<String> obs2 = Observable.just("Blah"); 
Observable<Boolean> obs3 = Observable.just(true); 

Observable.zip(obs1, obs2, obs3, (Integer i, String s, Boolean b) -> i + " " + s + " " + b) 
.subscribe(str -> System.out.println(str)); 

打印:

1 Blah true

相关问题