rx-java - 通过 Observable 将值返回给调用者
问题描述
我有一个带有以下方法的类,它返回一个Observable
:
public Observable<JsonObject> doSend(String message) {
CompletableFuture<JsonObject> resp = this.send(message);
return Observable.fromFuture(resp.whenComplete((response, err) -> {
response.success(callback -> {
return;
});
return ;
}));
该方法是从另一个类的以下方法调用的,其中senderClass
是包含上述方法的类的实例。
private void getData(Message<JsonObject> msgHandler) {
Observable<JsonObject> o = senderClass.doSend(...);
o.doOnComplete(() -> {
// do something
});
o.doOnEach(onNotification -> {
onNotification.getError();
});
}
当doSend
调用第一个类的方法时,处理程序中的参数正确地包含了对同一类response
中消息的调用结果。send
问题是该值似乎没有被返回,因此无法在从doSend
方法返回的 Observable 的第二个类中访问。
正确的编写方法是什么,以便可以在第一个类中设置值并在第二个类中访问?
谢谢
解决方案
Observable
(与其他反应类型一起)设计有一个流畅的接口,其中每个调用都返回一个新实例,该实例增强了声明的行为。
为了说明这一点,这:
Observable<Object> o = newObservable();
o.doOnComplete(...);
o.doOnEach(...);
...与此不同:
Observable<Object> o = newObservable()
.doOnComplete(...)
.doOnEach(...);
在前一个片段中,调用doOnComplete()
并doOnEach
创建 的新实例Observable
,但是由于它们没有分配给处理程序,因此它们被简单地丢弃,而没有o
通过这些行为进行增强。换句话说 - 这些方法不会改变它们的接收器。
后一个例子是惯用的方法。在这种情况下,是将提供给最初构造的流o
的行为应用到最初构造的流的累积结果。doOnComplete()
doOnEach
尝试getData()
使用第二种方法进行更新,看看是否能解决您的问题。
另外,我认为doSend()
可以简化为:
Observable.fromFuture(this.send(message))
...当然,除非您选择省略了其他一些逻辑。
推荐阅读
- java - Keycloak 添加新的身份验证器
- yaml - OCaml - 如何将 Yaml 序列化和反序列化为记录
- node.js - 如何在没有分配明确路线的情况下使每个文件都可以访问
- gcc - 如何在这一行中启用“是”,检查编译器驱动程序是否理解 Ada ... 否
- class - Pytorch TypeError: forward() 接受 2 个位置参数,但给出了 4 个
- java - ResponseEntity Api 在 REST API 中添加自定义错误消息
- javascript - Colvis 不显示任何列
- c - C 编程。如何在结构数组中传递字符串
- c# - 为什么通过投影会丢失一些导航属性?
- python - Flask,如何正确上传 CSV?