假设我有一个Observable,它将最多发射1个元素。
我想在元素发射之前和之后做一些事情。 我应该如何与运算符一起编写一个新的Observable?
说我想按以下顺序跟踪我的Observable:
对于“之后”,也许我可以使用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);
谢谢
利昂
答案 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
但是,您的解决方案完全有效,可以完成工作。在我看来,只是在执行之前为回调提供一个单独的位置是一个更方便的选择。