上次完成后添加新订阅

时间:2017-05-29 17:27:53

标签: java rx-java reactive-programming

我的 CompositeDisposable 中有3个 Disposaple 对象:

 CompositeDisposable disposables = new CompositeDisposable();

 disposables.add(
   interactor1
    .someMethod1()
    .subscribe(...some handling logic));

 disposables.add(
   interactor
    .someMethod2()
    .subscribe(...some handling logic));

 disposables.add(
   interactor
    .someMethod3()
    .subscribe(...some handling logic));

前两个方法返回一些数据并将其传输到其他方法。当前两个完成时必须调用第三个方法。我该怎么办?

示例方法签名:

 Single<List<String>> someMethod1();
 Single<List<Integer>> someMethod2();
 Single<String> someMethod3();

2 个答案:

答案 0 :(得分:2)

一个例子胜过千言万语:

public void SO() {
    Single.zip(someMethod1(),
            someMethod2(),
            Pair::create) // (1) create pair from results of someMethod1 and someMethod2
            .flatMap(methodsResultPair -> {
                // (2) handling logic of combined result
                // methodsResultPair.first is result of someMethod1
                // methodsResultPair.second is result of someMethod2
                return someMethod3();
            })
            .subscribe((resultOfMethod3, throwable) -> {
                // process resultOfMethod3
                // process error
            });
}

public Single<List<String>> someMethod1() {
    return Single.just(Collections.<String>emptyList())
            .doOnSuccess(objects -> { /* (3) handling logic of someMethod1 result */ });
}

public Single<List<Integer>> someMethod2() {
    return Single.just(Collections.<Integer>emptyList())
            .doOnSuccess(objects -> { /* (4) handling logic of someMethod2 result */ });
}

public Single<String> someMethod3() {
    return Single.just("");
}

有了这个,你有一个一次性而不是三个,因为它们现在都是一个反应链的一部分。 Single.just()方法仅用于提供一些虚拟数据。

答案 1 :(得分:0)

您将zip前两个可观察对象,然后在其输出上使用flatmap。当两个observable都产生了一个值时,zip函数会投影一个项目,然后组合的对象将被传递给flatmap,然后可以传递给你的第三个可观察函数。