2017-01-20 2 views
1

У нас есть две наблюдаемые A и B. A публикует результат, конечно, в то время как результат от B может вообще не публиковаться (тайм-аут).Комбинация RxJava Наблюдаемая с другой опцией Наблюдаемая с таймаутом

Вопрос заключается в том, чтобы сопоставить результат с A и B если B возвращается в пределах срока, в противном случае просто возвращает результат от A. Пример

Observable<DatabaseObject> A = getDatabaseElement(); 
Observable<NetworkObject> B = restApi.getElement(); 

Карта:

map((databaseObject, networkObject) => { 
    databaseObject.setData(networkObject); 
    return databaseObject; 
}) 

ответ

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); } 
) 
0

Возможно, вы захотите использовать другой подход. Существует оператор, предназначенный именно для описанное вами поведение. Взгляните на .timeout(long time, TimeUnits units, Observable backupObservable), который инструктирует поток переключиться с исходного наблюдаемого (в вашем случае B, запрос сети, который я предполагаю) на резервную копию. Наблюдается, если в исходном потоке нет других элементов за указанное количество времени.

+0

Это не то, что мне нужно. Я всегда хочу вернуть результат 'A', но необязательно обогащать его данными из' B'. – Mannaz