Возврат значений через Observable для вызывающей стороны - PullRequest
0 голосов
/ 23 октября 2018

У меня есть класс со следующим методом, который возвращает 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 втот же класс.Проблема заключается в том, что значение, по-видимому, не возвращается и поэтому не может быть доступно во втором классе из Observable, который возвращается из метода doSend.

Как правильно написать это такчто значение может быть установлено в первом классе и доступно во втором?

Спасибо

1 Ответ

0 голосов
/ 24 октября 2018

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

... если, конечно, у вас нет другой логики, которую вы решили опустить.

...