RxJava 的 Observable.create 与 Observable.just(1).flatMap
RxJava's Observable.create vs Observable.just(1).flatMap
我一直在做一些 RxJava,我经常发现自己需要将一些现有的代码结果转换为可观察的结果。
例如让我们采取以下内容:
ListenableFuture<T> result = request.executeAsync();
return result;
因此,将其转换为可观察对象的最简单方法是
ListenableFuture<T> result = request.executeAsync();
return Observable.from(result);
问题是 executeAsync
在调用时实际执行请求。我想要的是延迟该调用,直到订阅了可观察对象。
我想到了两种方法
return Observable.create { aSubscriber ->
if (!aSubscriber.unsubscribed) {
aSubscriber.onNext(request.executeAsync())
}
if (!aSubscriber.unsubscribed) {
aSubscriber.onCompleted()
}
}
和
return Observable
.just(1)
.flatMap((_) -> Observable.from(request.executeAsync()));
在我看来,使用 flatMap 选项更简单,因为我不必为订户逻辑操心。
使用 flatMap
而不是 create
有什么陷阱吗?是否有首选的 Rx 方式来简化集成?
谢谢
您可以改用 defer :
Observable.defer(() -> request.executeAsync())
.concatMap(Observable::from)
.subscribe();
RxJavaGuava 是一个小型库,可以为您将 ListenableFuture
转换为 Observable
,所以您最好使用它而不是 "home-made" 解决方案。
它允许你写
ListenableFutureObservable.from(request.executeAsync(), Schedulers.computation())
根据请求的作用,您必须选择正确的调度程序。
我一直在做一些 RxJava,我经常发现自己需要将一些现有的代码结果转换为可观察的结果。
例如让我们采取以下内容:
ListenableFuture<T> result = request.executeAsync();
return result;
因此,将其转换为可观察对象的最简单方法是
ListenableFuture<T> result = request.executeAsync();
return Observable.from(result);
问题是 executeAsync
在调用时实际执行请求。我想要的是延迟该调用,直到订阅了可观察对象。
我想到了两种方法
return Observable.create { aSubscriber ->
if (!aSubscriber.unsubscribed) {
aSubscriber.onNext(request.executeAsync())
}
if (!aSubscriber.unsubscribed) {
aSubscriber.onCompleted()
}
}
和
return Observable
.just(1)
.flatMap((_) -> Observable.from(request.executeAsync()));
在我看来,使用 flatMap 选项更简单,因为我不必为订户逻辑操心。
使用 flatMap
而不是 create
有什么陷阱吗?是否有首选的 Rx 方式来简化集成?
谢谢
您可以改用 defer :
Observable.defer(() -> request.executeAsync())
.concatMap(Observable::from)
.subscribe();
RxJavaGuava 是一个小型库,可以为您将 ListenableFuture
转换为 Observable
,所以您最好使用它而不是 "home-made" 解决方案。
它允许你写
ListenableFutureObservable.from(request.executeAsync(), Schedulers.computation())
根据请求的作用,您必须选择正确的调度程序。