我有一系列事件类似:“加载东西 - 显示它 - 存储它”。显示它并存储它当然同时发生(将它存储在后台,同时向用户显示)
这样的事情:
myVideoService.getVideo(id)
.compose(applySchedulers())
.subscribe((video) -> {
showVideo(video);
myVideoService.storeVideo(video).subscribe();
}, Throwable::printStackTrace)
我怎么能做这一行:
myVideoService.storeVideo(video).subscribe();
原始观察的一部分?我想在后台运行这个observable,但如果我使用flatMap,这将在显示视频之前发生,基本上阻止它。即使我没有多少时间,我仍然不喜欢这个概念:
myVideoService.getVideo(id)
.compose(applySchedulers())
.flatMap((video) -> myVideoService.storeVideo(video))
.subscribe((video) -> {
showVideo(video);
}, Throwable::printStackTrace)
这将使存储完成后的showVideo,而理想情况下这应该并排
显示和存储视频的任何其他方法都不会相互阻挡?
答案 0 :(得分:2)
问题是您在flatMap之前应用调度程序,因此flatMap会在主线程上进行求值。您必须在applySchedulers
之前拆分flatMap
或移动myVideoService.getVideo(id)
.subscribeOn(Schedulers.io()) // <----------------------------------
.flatMap((video) -> myVideoService.storeVideo(video))
.observeOn(AndroidSchedulers.mainThread()) // <----------------------------------
.subscribe((video) -> {
showVideo(video);
}, Throwable::printStackTrace);
:
export const routes: Routes = [
{
path: 'app', component: AppComponent,
children: [
path: 'category/:id', component: CategoryComponent,
children: [
{ path: 'post/:id', component: PostComponent }
]
]
}
];
答案 1 :(得分:0)
实现save
和show
的完全并行执行的一种方法是这样的。
创建一个PublishSubject,添加两个订阅,一个用于播放视频,另一个用于保存(myVideoService.storeVideo(video).subscribe()
)。
接听原来的myVideoService.getVideo(id)
电话并订阅主题。
这样你最终将完成两个并行操作。
PublishSubject subject = PublishSubject.create();
subject
.doOnNext(video -> myVideoService.storeVideo(video))
.subscribe();
subject
.subscribe(this::showVideo);
myVideoService.getVideo(id).subscribe(subject);
考虑到这一点,如果保存操作很快,就没有理由在@akarnokd解决方案上写下所有额外的代码。