RxJava zip获取最新的其他可观察

时间:2017-08-30 03:49:51

标签: rx-java rx-java2

我希望实现zip,当其中一个可观察源发出数据时,它不会等待其他observable发出数据,但如果有数据则会获取最新发出的数据。

obs1 --true-|->
obs2 --true-|->  
obs3 --1-2-3-4->

zip应该使用参数

执行TriFunction
true, true, 1
true, true, 2
true, true, 3
true, true, 4

我希望我的问题有道理。

扩展问题

我已经解决了部分问题,我为你们解决了另一个问题。 obs1obs2是昂贵的操作,会发出truefalse。我需要的是,在obs3的每次发射中,如果其中任何一个在前一次发射中发出obs1,我需要重新执行obs2false。我在顶部写的是最好的情况,obs1obs2true的第一次发射时发出obs3

-------1------------2-----------------3------------->
---true/false---true/re-execute---true/re-execute--->
---true/false---true/re-execute---true/re-execute--->

修改 "" 在扩展问题上具有误导性。

我的意思是,如果obs1在先前发射时为假,则重新执行obs1。如果先前发出的obs2为false,请重新执行obs2。如果其中一个是false,则不会重新执行它们。

1 个答案:

答案 0 :(得分:1)

编辑:扩展问题是一个完全不同的问题,需要不同的运营商,例如:

Observable<Boolean> obs1 = ...
Observable<Boolean> obs2 = ...

Observable<Integer> obs3 = ...

Function3<Integer, Boolean, Boolean> func = ...

// store last result of obs1 and obs2
boolean[] lastResults = { false, false };

// for each main value
obs3.concatMap(v -> {
    // if any of the previous results were false
    if (!lastResults[0] || !lastResults[1]) {
        // run both obs1 and obs2 again
        return Observable.zip(obs1, obs2, (a, b) -> {
            // save their latest results
            lastResult[0] = a;
            lastResult[1] = b;
            // apply the function to get the output
            return func(v, a, b);
        });
    }
    // otherwise call the function with true
    return Observable.just(func.apply(v, true, true));
})
.subscribe(...);