假设我们有两个可观察量A
和B
。 A
肯定会发布结果,而B
的结果可能根本不会发布(超时)。
问题是,如果A
在时间范围内返回,如何映射B
和B
的结果,否则只返回A
的结果。
Observable<DatabaseObject> A = getDatabaseElement();
Observable<NetworkObject> B = restApi.getElement();
地图示例:
map((databaseObject, networkObject) => {
databaseObject.setData(networkObject);
return databaseObject;
})
答案 0 :(得分:1)
为了使用时间参数超时B
可观察的使用take
运算符:
B.take(10, TimeUnit.SECONDS)
要接收A
或B
(如果B
在超时时准备就绪),请使用concatWith
:
A.concatWith(B.take(10, TimeUnit.SECONDS))
.takeLast(1)
如果您希望合并A
和B
(可选择将A
与B
合并):
A.concatWith(B.take(10, TimeUnit.SECONDS))
.reduce((a, b) -> a.setData(b))
如果A
和B
属于不同类型(可选择A
加B
):
Observable.combineLatest(
A,
B.take(10, TimeUnit.SECONDS).defaultIfEmpty(stubB)),
(a, b) -> { if (b != stubB) a.setData(b); }
)
答案 1 :(得分:0)
您可能希望在此处采用不同的方法。有一个运算符专为您描述的行为而设计。看看.timeout(long time, TimeUnits units, Observable backupObservable)
指示流从原始observable(在您的情况B中,我假设的网络请求)切换到备份A observable,当原始流中没有指定数量的其他项时时间。