我有一个场景,我有两个observable,每个都从API调用中返回一个项目。
我想做的是:
我欣赏有关如何实现这一目标的任何提示。
答案 0 :(得分:4)
假设你的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"))));
第二步是进一步修改你的observable,使他们在不同的线程上工作。这是使用subscribeOn
运算符
Observable<T> apiCall1WithTimeoutNewThread = apiCall1WithTimeout.subscribeOn(Schedulers.newThread());
Observable<T> apiCall2WithTimeoutNewThread = apiCall2WithTimeout.subscribeOn(Schedulers.newThread());
最后一步是合并您的observable的排放,但是您希望最后发出任何超时错误,幸运的是mergeDelayError
运营商就是这么做的
Observable<T> mergedCalls = Observable.mergeDelayError(apiCall1WithTimeoutNewThread, apiCall2WithTimeoutNewThread);