首页 > 解决方案 > 通过 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 的第二个类中访问。

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

谢谢

标签: rx-javarx-java2vert.x

解决方案


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))

...当然,除非您选择省略了其他一些逻辑。


推荐阅读