RxJava合并Observables但仅从第一个开始获取结果

时间:2015-08-20 17:49:17

标签: rx-java

我希望得到这样的东西: 我有生成observable的请求,并且我有一种可以成为行为主题的内存缓存。在我的代码中,我想以某种方式合并这两个observable,如果主题有一些数据我想要采取这些并且不要开始请求可观察。这样的事情可以实现吗?

目前我正在做这样的事情:

val resp = run { run(Task.GetMessages()) }

return InboxModel(news = Observable.merge(IoImplementation.cachedUserMessages(), resp).distinctUntilChanged())

但我不认为这很好

1 个答案:

答案 0 :(得分:0)

听起来你想尝试在缓存中找到可观察的工作,只有当它是空的然后才能尝试做真正的工作。 observable.switchIfEmpty(Observable)运算符应该满足您的需求。如果您的缓存可观察为空,那么它将订阅实际工作可观察。

public void handleRequests(Observable<Request> requests) {
    requests.flatMap(Request r -> {
            String key = r.getSomeCacheKey();
            return getFromCache(key)
                .switchIfEmpty(doRealWork(r)
                    .doOnNext(saveToCache(key))
                );
        })
        .subscribe((String response) -> System.out::println);
}

// hashmap based cache may not be what you want but i'm 
// including it for completeness of example
Map<String, Observable<String>> cache = //...

Observable<String> getFromCache(String key) {
    return cache.get(key);
}

Action1<String> saveToCache(String key) {
    return (String response) -> cache.put(key, response);
}

Observable<String> doRealWork(Request someRequest) {
    // imagine real work here
    return Observable.just("some response");
}