通过Observable将值返回给调用者

时间:2018-10-23 11:42:18

标签: rx-java rx-java2 vert.x

我有一个带有以下方法的类,该类返回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中访问第二个类。

编写此值以便可以在第一个类中设置值并在第二个类中访问值的正确方法是什么?

谢谢

1 个答案:

答案 0 :(得分:1)

Observable(以及其他反应类型)被设计为具有流畅的接口,在该接口中,每次调用都返回一个增强了声明行为的新实例。

为说明这一点,

Observable<Object> o = newObservable();
o.doOnComplete(...);
o.doOnEach(...);

...与此不同:

Observable<Object> o = newObservable()
    .doOnComplete(...)
    .doOnEach(...);

在先前的代码段中,对doOnComplete()doOnEach的调用创建了Observable的新实例,但是由于未将它们分配给处理程序,因此它们会在没有{{1 }}通过这些行为得到增强。换句话说-这些方法不会改变其接收者。

后一个示例是惯用方法。在这种情况下,o是将提供给odoOnComplete()的行为应用于原始构造的流的累积结果。

尝试使用第二种方法更新doOnEach,看看是否可以解决您的问题。

此外,我认为getData()可以简化为:

doSend()

...除非您当然有选择忽略的其他逻辑。