我希望实现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
我希望我的问题有道理。
扩展问题
我已经解决了部分问题,我为你们解决了另一个问题。
obs1
和obs2
是昂贵的操作,会发出true
或false
。我需要的是,在obs3
的每次发射中,如果其中任何一个在前一次发射中发出obs1
,我需要重新执行obs2
或false
。我在顶部写的是最好的情况,obs1
和obs2
在true
的第一次发射时发出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
,则不会重新执行它们。
答案 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(...);