如何通过使用RxJava-Android等待多个嵌套的异步调用?
我是Rx
Java的新手,这是我的情况,
>发送请求A,并将获得列表< A>背部 例: request(url1,callback(List<A> listA) { for (A a : listA) { request(url2,callback(AA aa) { a.set(aa); } } } A和B是独立的 如何构建代码?我也用Retrofit作为网络客户端. 谢谢. 解决方法
好的,我想这应该解决你的问题的第一部分:
请注意,对flatMap的第二次调用给定了2个参数 – 有一个flatMap版本,它不仅为每个输入项产生一个Observable,而且还需要一个第二个函数,这个函数又将所得到的Observable中的每个项目与相应的输入项目. 看看这个标题下的第三个图形,以获得直观的理解: https://github.com/ReactiveX/RxJava/wiki/Transforming-Observables#flatmap-concatmap-and-flatmapiterable Observable<A> obeservableOfAs = retrofitClient.getListOfAs() .flatMap(new Func1<List<A>,Observable<A>>() { @Override public Observable<A> call(List<A> listOfAs) { return Observable.from(listOfAs); } )} .flatMap(new Func1<A,Observable<AA>>() { @Override public Observable<AA> call(A someA) { return retrofitClient.getTheAaForMyA(someA); } },new Func2<A,AA,A>() { @Override public A call(A someA,AA theAaforMyA) { return someA.set(theAaforMyA); } }) ... 从这里开始,我仍然不确定你想继续下去:你准备好订阅了由此产生的可观察的?这样你可以处理每个As(onNext)或只是等到所有的完成(onCompleted). 附录:要将所有项目收集到单个列表中,那么可以将您的“可观察”< A>变成可观察的< List< A>>使用toList(). https://github.com/ReactiveX/RxJava/wiki/Mathematical-and-Aggregate-Operators#tolist 所以你有: Observable<List<A>> observableOfListOfAs = observableOfAs.toList(); 如果您需要对列表的构建进行更细粒度的控制,您还可以使用reduce. https://github.com/ReactiveX/RxJava/wiki/Mathematical-and-Aggregate-Operators#reduce 对于B,只需复制您用于As的整个流程. 然后可以使用zip等待两个流完成: Observable.zip( observableOfListOfAs,observableOfListOfBs,new Func2<List<A>,List<B>,MyPairOfLists>() { @Override public MyPairOfLists call(List<A> as,List<B> bs) { return new MyPairOfLists(as,bs); } } ) .subscribe(new Subscriber<MyPairOfLists>() { // onError() and onCompleted() are omitted here @Override public void onNext(MyPairOfLists pair) { // now both the as and the bs are ready to use: List<A> as = pair.getAs(); List<B> bs = pair.getBs(); // do something here! } }); 我想你可以猜测MyPairOfLists的定义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |