RxJava 嵌套调用接口

    我的标题写的很清楚是嵌套调用接口。比如你需求是要调用两个接口,只允许两个接口同时成功,只有一个成功就不算成功而不去更新UI,否则只有一个成功去更新UI会出现“bug”的感觉。所以你要嵌套来调用者两个接口,就是在第一个接口成功的基础上去调用第二个接口,在第二个接口成功的前提下才去更新UI。(暂时先不讨论你的需求规定那个接口调用必须在前面的问题,后面会直接说的)


  用RxJava操作符flatMap就可以直接解决,不是merge。我先讲一下merge会是什么样的效果。


  1、merge:

代码如下,我特地在test1里面加了一个延时,因为你用merge去调接口的时候你肯定不能保证那个接口先调用完毕,我这里假定第一个接口(test1)耗时长一些,如果你这样写的话,log会先打印22再打印111。我这样写可能有人就反驳,你给第一个加了延时他肯定是后打印啊。呵呵,我说的很清楚,你在merge同时调用两个接口的时候,你不能保证那个接口先调用完毕,我这里模拟的情况是第一个接口网速比较差,我想表达的意思是使用merge的时候,不能达到嵌套的效果,他会那个接口先调用完毕就先走到subscribe里面去。

Observable test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable test2 = Observable.just("22");
        Observable.merge(test1, test2)
                .subscribe(o -> {
                    Log.e(TAG, o.toString());
                }, e -> {
                });
 2、flatMap:

  你嵌套调用接口无非是两种原因(场景):

(1)拿着第一个接口的返回值作为第二个接口的入参使用。

(2)等两个接口都调用成功的前提下去搭配使用两个接口返回的数据。


(1)上面的场景一:

 Observable test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable.just(1)
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(Integer integer) throws Exception {
                        return test1;
                    }
                })
                .flatMap(new Function>() {
                    @Override
                    public ObservableSource apply(String s) throws Exception {
                        return Observable.just(s+"22");
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.e(TAG, o.toString());
                    }
                });(2)上面的场景二: 
  

Observable test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable test2 = Observable.just("666");
        result1 = "";
        Observable.just(1)
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(Integer integer) throws Exception {
                        return test1;
                    }
                })
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(String s) throws Exception {
                        result1 = s;
                        return test2;
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(String result2) throws Exception {
                        Log.e(TAG, result1 + result2);
                    }
                });

3、用flatMap嵌套调用接口如果某一个接口出错了,会直接终结调,不往下走,如下我用5/0,会直接走到trhowable


Observable test1 = Observable.just("111").delay(6, TimeUnit.SECONDS);
        Observable test2 = Observable.just("666");
        result1 = "";
        Observable.just(1)
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(Integer integer) throws Exception {
                        int s = 5 / 0;
                        return test1;
                    }
                })
                .flatMap(new Function>() {
                    @Override
                    public Observable apply(String s) throws Exception {
                        result1 = s;
                        return test2;
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(String result2) throws Exception {
                        Log.e(TAG, result1 + result2);
                    }
                }, throwable -> Log.e(TAG, "出错啦:" + throwable.getMessage()));





你可能感兴趣的:(RxJava学习)