我在Web服务中使用RxJava来创建多个observable,每个observable都在onNext和onError函数中执行某些操作。我想等到所有这些observable完成其工作之后才返回客户端的响应,但我也希望这些任务并行执行
我使用以下方法合并了所有这些:
Observable<List<Obj>> mergedObs = Observable.mergeDelayError(tasks)
然后我通过
将其转换为阻塞的observablemergedObs.toList().toBlocking.subscribe(...)
但是,我注意到,当合并的observable等待所有任务调用subscribe()时,它不等待subscribe函数中的任务完成。这里有一些示例代码,省略了不重要的细节:
public void doWork() {
Observable<Obj> mergedTasks = getTasks();
mergedTasks.toList().toBlocking().subscribe(
results -> LOG.info("Done!)
);
return; // eventually returns a web response
}
private Observable<Obj> getTasks() {
List<Observable<Obj>> tasks = new ArrayList<>();
Observable<Obj> task1 = getTask1();
Observable<Obj> task2 = getTask2();
tasks.add(task1);
tasks.add(task2);
// Both tasks execute in parallel
tasks.toList().subscribe(
result -> processSearch(), // this can execute after the service returns a response!
exception -> handleException() // this can execute after the service returns a response!
);
return Observable.mergeDelayError(tasks);
}
private Observable<Obj> getTask1() {
// implementation detail
}
private Observable<Obj> getTask2() {
// implementation detail
}
虽然此代码 等待两个任务调用subscribe(),但它不会等待onSuccess或onError中执行的工作。