首页 > 解决方案 > 如何用之前/之后的行为组成一个 Observable

问题描述

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

我想在元素发射之前和之后做一些事情。我想如何与操作员一起组成一个新的 Observable?

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

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

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

提前致谢!

编辑:

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

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

谢谢

莱昂

标签: rx-javarx-java2

解决方案


我认为,一种更清洁的方法是这样使用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

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


推荐阅读