让我直接解决这个问题。我有拨打网络电话的清单。我正在使用merge
的{{1}}运算符来合并网络调用列表,并依次执行它们,最后获得输出列表。现在我面临一个问题。如果任何网络呼叫失败,则在下一个网络呼叫之间将不会进行,并且执行将停止。无论成功或失败,如何确保列表中的所有网络调用都已执行?
RxJava
在这里,如果我观察到Observable<String> op1 = service1.operation();
Observable<String> op2 = service2.operation();
Observable<String> op3 = service3.operation();
Observable<List<String>> lst = Observable.merge(op1, op2, op3).toList();
,它应该返回lst
的列表,其中包含成功或失败的结果。
答案 0 :(得分:1)
Exception是rxjava中的terminal event
,它会终止发生它的流(如果不使用任何运算符来处理它,则终止任何外部流)。但是,如果将该流包装在内部流中并应用运算符onErrorReturnItem
,则可以避免使用它。内部流无论如何都将终止,但是您无需通过应用onError
运算符将onErrorReturnItem
传递给外部流,而是将onNext
传递给外部流,这样外部流就不会被终止:
public static Observable<String> serviceOperation(String param) {
return Observable.just(param)
.doOnNext(s -> {
//simulate error when param is "value 2"
if (s.equals("value 2")) {
throw new IllegalStateException("Something happened");
}
});
}
public static void main(String args[]) {
//here we create a stream and by using concatMap creating another inner stream
Observable<String> op1 = Observable.just(1)
.concatMap(integer -> {
return serviceOperation("value 1")
.onErrorReturnItem("Error");
});
Observable<String> op2 =Observable.just(1)
.concatMap(integer -> {
return serviceOperation("value 2")
.onErrorReturnItem("Error");
});
Observable<String> op3 = Observable.just(1)
.concatMap(integer -> {
return serviceOperation("value 3")
.onErrorReturnItem("Error");
});
Observable.merge(op1, op2, op3)
.toList()
.subscribe(strings -> strings.forEach(System.out::println), Throwable::printStackTrace);
}
这将打印:
value 1
Error
value 3