java - toBlocking() 中的错误处理

标签 java rx-java reactive-programming

我正在使用 RxJava 将应用程序重构为响应式范例。我正在逐步进行,所以我需要使用 toBlocking()在某些情况下,暂时为了尊重接口(interface)。使用时如何处理错误 toBlocking()

之前,我有这样的事情:

public List<Employee> getEmployees() {
    try {
        return repository.getEmployees();
    } catch(Exception e) {
        throw new MyCustomException();
    } 
}

现在,存储库有一个 react 接口(interface)(返回 Observable<List<Employee>> ),所以我这样做:

public List<Employee> getEmployees() {
    return repository.getEmployees().toBlocking().single(); 
}

订阅 repository.getEmployees()可能返回错误 Observable .我的问题是:我该如何处理这个错误,让它一直处于阻塞状态?

我找到了一个方法singleOrDefault() , 但类似于 singleOrThrow(new MyCustomException())会很好。

最佳答案

你不能这样做,你需要用 try/catch block 包装它, toBlocking()Observable 转换为 BlockingObservable 这不完全是 react block ,更像是花哨的集合,它现在缺乏组合 Observables 的能力,运算符,控制线程/并行度,以及异步 API 的基本结构,内置错误处理,(onError())

关于 BlockingObservable 的文档说明:

It can be useful for testing and demo purposes, but is generally inappropriate for production applications (if you think you need to use a BlockingObservable this is usually a sign that you should rethink your design).

那么,阻塞 Observable 有什么意义呢?如果你不能将接口(interface)更改为 Observable,那么你可能会错过使用 Rx 和 Observable 的所有要点,这是(在理想情况下)抽象出每个基于事件的在系统中运行,然后能够使用 Operators/Composition/Async 管理的强大功能并在您的系统中构建事件流。
如果你只是用 Observable 包装一些 API 操作,然后将它返回到非 react 世界,那么 API 的消费者就无法享受 Rx 的所有上述好处。
所以,我认为你应该重新考虑这样做的目的是什么,你的最终目标是什么,你可以考虑在你的系统中的几个地方替换为 Reactive 方法作为开始。

关于java - toBlocking() 中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786273/

相关文章:

java - 可以使用Android studio进行纯JAVA开发吗

java - 如何使用模式匹配获取子字符串

rx-java - 仅对 bool 可观察值中的错误值进行反跳

java - 使用 RxJava 链接一系列操作 - 下一步去哪里?

android - 有没有办法在 rx-java/kotlin 中对 groupBy 键进行排序?

javascript - React 在提交处理程序中找不到 &lt;input/> 值

java - Android SDK 中的 Junit 测试

java - Ebean/Play Framework 关系未更新

java - Observable 仍在 UI 线程上运行

javascript - 如何在 rxjs 中组成一系列可观察值