2016-10-28 56 views
0

我有方法返回Place的对象,但首先我必须检查Place对象是否存在于数据库中,然后返回他或以其他方式从休息服务中获取Place对象。如何最简单的方法我可以检查出来?如何比较Observable的结果并返回其中一个

public Observable<Place> getPlace(final String id) { 

    // Both method from repository and rest are: Observable<Place> getPlace(String id); 

    // if placeDatabaseRepository.getPlace(id) != null then: 
    return placeDatabaseRepository.getPlace(id); 
    // else Place == NULL then: 
    return placeRest.getPlace(id); 
} 
+0

的【什么是RxJava相当于否则容易的(可能的复制http://stackoverflow.com/questions/32833705/what-is-rxjava-equivalent-of-orelse) –

+0

你可以在你的可观察值上使用'switchIfEmpty'运算符 – nnesterov

回答

1

Dan Lew写道an excellent article关于这个问题。

它的要点是你使用两个Observable<Place>实例 - 如果它不是null,则返回数据库的结果,另一个从REST调用返回结果。你与concat()运营商把它们结合在一起,只需要与运营商first()第一发射项目,有点像这样:

Observable<Place> dbSource = Observable 
    .just(placeDatabaseRepository.getPlace(id)) 
    .filter(place -> place != null); 
Observable<Place> restSource = Observable 
    .just(placeRest.getPlace(id)); 

return Observable 
    .concat(dbSource, restSource) 
    .first(); 
+1

这篇文章建议使用concat observable的第一个(条件)。您的代码片段将过滤器应用于数据库observable。这种变化的原因是什么?我在博客文章中使用了该方法,当数据库为空时(剩下的observable没有运行),它就无法工作。你的建议在这里会起作用。 – Francesc

+0

嗯,这很令人费解。我在数据库源代码中编写了过滤器作为首选项 - 我甚至没有假设它会有所作为......这需要一些调试。 – npace

+1

如果placeDatabaseRepository为空,您将得到一个NPE,该NPE不会传递到链中。也许使用像Object.requireNonNull(placeDatabaseRepository)之类的东西,并删除空过滤器。如果你在流水线中得到“null”,那么只需要空过滤器。对于“getPlace”方法,我会使用超时。如果其中一个观察对象没有产生价值/没有完成,你会永远阻止。 –

相关问题