如何为多个可观察对象设置超时
How to set a timeout for multiple observables
我有一个场景,我有两个 observable,每个 returns 来自 API 调用的一个项目。
我想做的是:
- 同时执行两个 api 调用。
- 为两种方法设置超时值(500 毫秒)以完成。
- 在两者完成后接收结果,如果两者花费的时间都小于超时值(500 毫秒),我将收到两者的结果,如果只有一个完成,那么我想接收它的结果并收到错误或第二个的空值。
- 如果两者都没有在超时内完成,我想收到一个错误消息。
我很感激关于如何实现这一点的任何提示。
假设您的 api return 一个 Observable 具有 T 类型的发射,第一步是修改这些 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);
我有一个场景,我有两个 observable,每个 returns 来自 API 调用的一个项目。
我想做的是:
- 同时执行两个 api 调用。
- 为两种方法设置超时值(500 毫秒)以完成。
- 在两者完成后接收结果,如果两者花费的时间都小于超时值(500 毫秒),我将收到两者的结果,如果只有一个完成,那么我想接收它的结果并收到错误或第二个的空值。
- 如果两者都没有在超时内完成,我想收到一个错误消息。
我很感激关于如何实现这一点的任何提示。
假设您的 api return 一个 Observable 具有 T 类型的发射,第一步是修改这些 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);