Rx java 如何用Before/After行为组成一个可观察的

Rx java 如何用Before/After行为组成一个可观察的,rx-java,rx-java2,Rx Java,Rx Java2,假设我有一个可观测的,它最多发射1个元素 我想在元素发射前后做点什么。 我该如何使用算符来组成一个新的可观察的对象呢 假设我想按以下顺序跟踪我的可观察对象: 日志开始时间戳(span.start()) 执行真正的业务以发射元素 日志结束时间戳(span.finish()) 对于“after”,也许我可以使用doOnComplete和doOnError 但我不知道怎么做“之前” 提前谢谢 编辑: 以下是我能想到的一种方法,不确定这是最好的方法还是有任何潜在问题: Future<String&

假设我有一个可观测的,它最多发射1个元素

我想在元素发射前后做点什么。 我该如何使用算符来组成一个新的可观察的对象呢

假设我想按以下顺序跟踪我的可观察对象:

  • 日志开始时间戳(span.start())
  • 执行真正的业务以发射元素
  • 日志结束时间戳(span.finish())
  • 对于“after”,也许我可以使用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);
    
    Future f=CompletableFuture.supplyAsync(()->{
    返回“做生意”;
    });
    可观测原始=可观测。从(f)开始。未完成(()->{
    System.out.println(“内部后”);
    });
    可观察的装饰=可观察的延迟(()->{
    系统输出打印项次(“之前”);
    归还原件;
    }).doOnCompleted(()->{
    System.out.println(“外部后”);
    });
    订阅(System.out::println);
    
    谢谢


    Leon

    我认为,一个更干净的方法是使用
    doOnSubscribe
    如下:

    Observable createInitialObservable(){
    返回可观察。从可调用(()->{
    System.out.println(“执行…”);
    返回“做生意”;
    });
    }
    可观测装饰可观测(可观测源){
    返回源
    .doOnSubscribe(d->System.out.println(“执行前”))
    .doOnNext((项目)->System.out.println(“收到的项目“+”项目“”))
    .doOnComplete(()->System.out.println(“执行后”);
    }
    无效测试(){
    可观测源=createInitialObservable();
    decorateObservable(源)
    .subscribe(System.out::println);
    }
    
    产出将是:

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

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

    我认为,更干净的方法是使用
    doOnSubscribe
    如下:

    Observable createInitialObservable(){
    返回可观察。从可调用(()->{
    System.out.println(“执行…”);
    返回“做生意”;
    });
    }
    可观测装饰可观测(可观测源){
    返回源
    .doOnSubscribe(d->System.out.println(“执行前”))
    .doOnNext((项目)->System.out.println(“收到的项目“+”项目“”))
    .doOnComplete(()->System.out.println(“执行后”);
    }
    无效测试(){
    可观测源=createInitialObservable();
    decorateObservable(源)
    .subscribe(System.out::println);
    }
    
    产出将是:

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

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

    创建自己的回调接口对项目来说困难吗?这样做,你可能会得到你想要的完美匹配回调。假设原始的可观察对象是由A创建的,B想用一些逻辑来装饰它,并创建一个新的可观察对象。B不能更改A的代码。但是如果A的可观察性不是最终的,您可以重写回调方法并添加新逻辑。例如,重写start方法和add before logic并调用super.start()?,作为一个备用项。。。看起来您刚刚熟悉了RxJava的反应类型。熟悉
    可观察的
    类型是一个很好的起点,一旦您熟悉了它的语义,请查看其他类型。例如,给定源“最多发射1个元素”的描述,
    Single
    可能比
    Observable
    更清楚地表达设计意图(如果设计的这一部分在您的控制之下)。创建自己的回调接口对您的项目来说困难吗?这样做,你可能会得到你想要的完美匹配回调。假设原始的可观察对象是由A创建的,B想用一些逻辑来装饰它,并创建一个新的可观察对象。B不能更改A的代码。但是如果A的可观察性不是最终的,您可以重写回调方法并添加新逻辑。例如,重写start方法和add before logic并调用super.start()?,作为一个备用项。。。看起来您刚刚熟悉了RxJava的反应类型。熟悉
    可观察的
    类型是一个很好的起点,一旦您熟悉了它的语义,请查看其他类型。例如,给定源“最多发射1个元素”的描述,
    Single
    可能比
    Observable
    更清楚地表达设计意图(如果设计的该部分在您的控制下)。酷!我想这正是我想要的,非常感谢!酷!我想这正是我想要的,非常感谢!