我有一个案例,当我有多个observable,每个observable都有自己的实现,它们可能是相同的类型,或者我还没有决定知道的不同,但我们假设它们是相同的类型。
Observable<String> source1;
Observable<String> source2;
Observable<String> source3;
Observable<String> source4;
我现在需要做的只是执行其中一个,所以如果上一个失败,流只会移动到下一个observable。
一些可能的解决方案:
onErrorResumeNext()如果它们只有两个则可能是好的 observables,但在我的情况下,如果我需要更改执行顺序,很难更新每个observable。
有最新组合,但我不知道它是否与我一样 描述,或根据需要进行哪些修改。
如何实现这样的目标,如果他们有不同的类型,我需要做什么?
答案 0 :(得分:1)
我不知道是否有更好的方法可以做到这一点,但我会在import traceback
# ... your code ...
con = psycopg2.connect("host='localhost' dbname='football' user='postgres' password='XXX'")
cur = con.cursor()
try:
cur.execute("CREATE TABLE testtest123 (HY INTEGER PRIMARY KEY)")
cur.execute("INSERT INTO testtest123(new_data)")
cur.execute("SELECT * FROM testtest123;")
con.commit()
except:
print ("Error:")
traceback.print_exc()
con.rollback()
sys.exit(1)
finally:
if con:
con.close()
的帮助下使用onErrorResumeNext()
来使其变得灵活:
Observable<String> buildObservable(Observable<String> obs, Observable<String>... subsequentObservables) {
Observable<String> observable = obs;
for (int i = 0; i < subsequentObservables.length; i++) {
observable = concatErrorObservable(observable, subsequentObservables[i]);
}
return observable;
}
其中concatErrorObservable
是:
Observable<String> concatErrorObservable(Observable<String> observable, Observable<String> observable2) {
return observable.onErrorResumeNext(observable2);
}
因此,您只需要向Observable
方法提供buildObservable
列表。例如:
buildObservable(Observable.error(new Throwable("error!!")),
Observable.just("observable2"),
Observable.just("observable3"))
.subscribe(s -> Log.d(TAG, "result: " + s));
将打印observable2
(在logcat中),因为第一个observable会抛出错误。
关于不同的类型,您可能需要为每个map
使用不同的Observable
,因为我认为您的消费者(观察者)只期望一种类型的发布数据。
答案 1 :(得分:1)
您可以使用onErrorResumeNext
和reduce
这样的组合观察结果:
Observable<String> buildObservable(List<Observable<String>> observables) {
return Observable.fromIterable(observables)
.reduce(Observable::onErrorResumeNext)
.flatMapObservable(obs -> obs);
}
<强>更新强>
要进一步解释,如果您使用列表[o1, o2, o3]
调用该方法,那么
fromIterable
会返回更高级别可观察对象 just(o1, o2, o3)
reduce
将组合此可观察元素的元素,依次调用onErrorResumeNext()
与每个元素,如下所示:
o1 -> o1.onErrorResumeNext(o2) -> o1.onErrorResumeNext(o2).onErrorResumeNext(o3),
导致更高级别&#34; 1元素可观察,相当于 just(o1.onErrorResumeNext(o2).onErrorResumeNext(o3))
。
flatMapObservable()
行会将此1元素的observable替换为其唯一的元素本身,即 o1.onErrorResumeNext(o2).onErrorResumeNext(o3)
(不包含just()
)。
此结果实现了您需要的回退机制。