我有N个单一来源,我想连续这些并获得最新成功的Single。例如:
DB Single:
- [A] - | - >
API Single:
--- --- X>
Single.concat(DB,API):
- [A] - | - >
否则:
DB Single:
- [A] - | - >
API Single:
- [B] - | - >
Single.concat(DB,API):
- [B] - | - >
这可能吗?我阅读了文档,但没有找到类似“lastSuccessfullOrError()”方法的内容。我试过“elementAt”,“lastOrError”和其他人,但他们的行为不是我正在寻找的
谢谢
答案 0 :(得分:1)
这可以通过以下方式实现:
public static <T> Single<T> latestSuccess(Single<T>... sources) {
return Single.defer(() -> {
AtomicReference<T> last = new AtomicReference<T>();
return Observable.fromArray(sources)
.concatMap(source ->
source.doOnSuccess(last::lazySet)
.toObservable()
.onErrorResumeNext(Observable.empty())
)
.ignoreElements()
.andThen(Single.fromCallable(() -> {
if (last.get() == null) {
throw new NoSuchElementException();
}
return last.get();
}));
});
}