我有一个场景,我有两个可观察对象,每个都从API调用返回一个项目。
我想做的是:
我很赞赏如何实现这一目标的提示。
假设两个api都返回一个发射类型为T的Observable,第一步是修改这些Observable,使其超时。您可以使用amb
和Timer
功能进行操作。
Observable<T> apiCall1WithTimeout = Observable.amb(apiCall1(),
Observable.Timer(500, TimeUnit.MILLISECONDS)
.flatmap(l -> Observable.error(new Exception("Api1 timed out")));
Observable<T> apiCall2WithTimeout = Observable.amb(apiCall2(),
Observable.Timer(500, TimeUnit.MILLISECONDS)
.flatmap(l -> Observable.error(new Exception("Api2 timed out"))));
第二步是进一步修改您的可观察对象,以便它们在不同的线程上工作。这是使用subscribeOn
运算符
Observable<T> apiCall1WithTimeoutNewThread = apiCall1WithTimeout.subscribeOn(Schedulers.newThread());
Observable<T> apiCall2WithTimeoutNewThread = apiCall2WithTimeout.subscribeOn(Schedulers.newThread());
最后一步是合并来自可观测对象的发射,但是您希望最后发出任何超时错误,幸运的是,mergeDelayError
操作符就是这样做的
Observable<T> mergedCalls = Observable.mergeDelayError(apiCall1WithTimeoutNewThread, apiCall2WithTimeoutNewThread);