如何用前/后行为组成一个可观察对象

时间:2018-11-03 03:21:58

标签: rx-java rx-java2

假设我有一个Observable,它将最多发射1个元素。

我想在元素发射之前和之后做一些事情。 我应该如何与运算符一起编写一个新的Observable?

说我想按以下顺序跟踪我的Observable:

  1. 日志开始时间戳(span.start())
  2. 做真实的生意来散布元素。
  3. 日志结束时间戳记(span.finish())

对于“之后”,也许我可以使用doOnComplete和doOnError 但我不知道该如何做才能“之前”

谢谢!

编辑:

这是我可以提出的1种方法,不确定这是最好的方法还是存在任何潜在问题:

Future<String> f = CompletableFuture.supplyAsync(() -> {
  return "Do Biz";
});

Observable<String> original = Observable.from(f).doOnCompleted(() -> {
  System.out.println("inner after");
});
Observable<String> decorated = Observable.defer(() -> {
  System.out.println("Before");
  return original;
}).doOnCompleted(() -> {
  System.out.println("outer after");
});

decorated.subscribe(System.out::println);

谢谢

利昂

1 个答案:

答案 0 :(得分:3)

我认为,更干净的方法是像这样使用doOnSubscribe

Observable<String> createInitialObservable() {
    return Observable.fromCallable(() -> {
        System.out.println("Execution...");
        return "Do Biz";
    });
}

Observable<String> decorateObservable(Observable<String> source) {
    return source
            .doOnSubscribe(d -> System.out.println("Before execution"))
            .doOnNext((item) -> System.out.println("Received item '" + item + "'"))
            .doOnComplete(() -> System.out.println("After execution"));
}

void test() {
    Observable<String> source = createInitialObservable();
    decorateObservable(source)
            .subscribe(System.out::println);
}

输出为:

Before execution
Execution...
Received item 'Do Biz'
Do Biz
After execution

但是,您的解决方案完全有效,可以完成工作。在我看来,只是在执行之前为回调提供一个单独的位置是一个更方便的选择。