英文:
how do I make a db call when cache is empty and set value to cache from db?
问题
以下是您提供的内容的翻译部分:
我有一个缓存和一个数据库。我正在从缓存中获取值。如果缓存中的数据为空(因为已过期),我会从数据库中获取数据,并在从缓存中获取数据后,将值从数据库设置到缓存中。
Single<String> get() {
return getFromCache().onErrorResumeNext(getFromDatabase());
}
Single<String> getFromCache() {
//return Single.just("cache");
return Single.error(new Exception("exception"));
}
Single<String> getFromDatabase() {
return Single.just("database");
}
Single<String> setDatabase(Single<String> val) {
return val.map(
v -> {
String res = v;
System.out.println(res);
return res;
}
);
}
在这里,如果从缓存中获取的值为空,我可以调用数据库,但是接下来我无法调用 setDatabase
方法。
------------ 我已经找到了解决方法 ---------------------------
由于我对 RxJava 不太了解,我想知道最佳解决方法是什么。
Single<String> get() {
Observable<String> cacheObservable = getFromCache().toObservable();
Observable<String> databaseObservable = getFromDatabase().toObservable();
Single<String> result = Observable.concat(cacheObservable, databaseObservable).firstOrError();
databaseObservable.doOnNext(val -> {
setDatabase(val);
});
return result;
}
Maybe<String> getFromCache() {
//return Maybe.just("cache");
return Maybe.empty();
}
Single<String> getFromDatabase() {
return Single.just("database");
}
void setDatabase(String res) {
System.out.println(res);
}
请注意,我只翻译了您提供的代码部分,其他部分均被忽略。如果您有任何进一步的问题或需要更多的帮助,请随时提问。
英文:
I have a cache and a database.I am fetching value from cache. if data from cache is empty (due to expiration). I am making a call to database and after fetching data from cache. I will set the value from database to cache.
Single<String> get() {
return getFromCache().onErrorResumeNext(getFromDatabase());
}
Single<String> getFromCache() { // or should I use may be here
//return Single.just("cache");
return Single.error(new Exception("exception"));
}
Single<String> getFromDatabase() {
return Single.just("database");
}
Single<String> setDatabase(Single<String> val) {
return val.map(
v -> {
String res = v;
System.out.println(res);
return res;
}
);
}
Here I am able to call database if value from cache is empty but then I am not able to call method setDatabase.
------------ I have found this way to solve it---------------------------
Since I am new to rxjava. I wanted to what is best way to solve this
Single<String> get() {
Observable<String> cacheObservable = getFromCache().toObservable();
Observable<String> databaseObservable = getFromDatabase().toObservable();
Single<String> result = Observable.concat(cacheObservable, databaseObservable).firstOrError();
databaseObservable.doOnNext(val-> {
setDatabase(val);
});
return result;
}
Maybe<String> getFromCache() { // or should I use may be here
//return Maybe.just("cache");
return Maybe.empty();
}
Single<String> getFromDatabase() {
return Single.just("database");
}
void setDatabase(String res) {
System.out.println(res);
}
答案1
得分: 0
你几乎完成了,针对你的用例使用switchIfEmpty
:
Single<String> get() {
return getFromCache()
.switchIfEmpty(getFromDatabase().doOnSuccess(this::setDatabase));
}
英文:
You were almost done, use switchIfEmpty
for your use case :
Single<String> get() {
return getFromCache()
.switchIfEmpty(getFromDatabase().doOnSuccess(this::setDatabase));
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论