rx-java - 如何用之前/之后的行为组成一个 Observable
问题描述
假设我有一个 Observable,它最多会发出 1 个元素。
我想在元素发射之前和之后做一些事情。我想如何与操作员一起组成一个新的 Observable?
假设我想按以下顺序跟踪我的 Observable:
- 记录开始时间戳 (span.start())
- 做真正的生意来发射元素。
- 日志结束时间戳 (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);
谢谢
莱昂
解决方案
我认为,一种更清洁的方法是这样使用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
但是,您的解决方案是完全有效的,并且可以完成工作。只是在我看来,在执行之前有一个单独的回调位置是一个更方便的选择。
推荐阅读
- entity-framework - 在弱实体实体框架中插入重复记录
- sql - 将 Employee 表中的所有数据从数据库复制到 A 到数据库 B 上的 Employee 表
- python - A3C 的自定义内存层
- bash - 如何让Linux中的tee逐行提供屏幕输出,而不是在执行结束时?
- macos - 如何在云端构建和部署 iOS 应用程序?
- php - 长 PHP 脚本在 10 分钟标记处导致 500 错误
- r - 基于另一个向量的值重新分配向量索引的值的问题
- javascript - 合并具有相同键的两个对象会覆盖第一个数组
- css - 如何让 Visual Studio Code 将“”(反引号)内的文本识别为代码?
- winapi - “设备实例路径”名称是否有名称限制?