java - RxJava Completable Concat
问题描述
考虑以下代码段:
@Test
public void completableConcatTest() {
Completable.concat(completableTwoSeconds(), completableTwoSeconds())
.doOnCompleted(() -> System.out.println("Both completed."))
.await();
}
private Completable completableTwoSeconds() {
PublishSubject<Void> subject = PublishSubject.create();
CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
subject.onCompleted();
return null;
});
return subject.doOnCompleted(() -> System.out.println("I'm completed." + Instant.now())).toCompletable();
}
运行时,测试产生以下输出:
I'm completed.2018-05-11T10:07:26.359Z
I'm completed.2018-05-11T10:07:26.380Z
Both completed.
显然,两个可完成程序并行运行,而不是按预期顺序运行。
你能解释一下我在这里做错了什么吗?
提前致谢!
解决方案
CompletableFuture
s 几乎在声明后立即开始执行,这是您completableTwoSeconds()
在 RxJava 之前执行的方式并concat
参与其中。您必须至少推迟第二次调用才能completableTwoSeconds()
让它在第一次完成后执行:
Completable.concat(
completableTwoSeconds(),
Completable.defer(() -> completableTwoSeconds())
)
.doOnCompleted(() -> System.out.println("Both completed."))
.await();
推荐阅读
- python - 如何在 python 中使用 selenium 查找元素
- r - 如何将每个数据点颜色填充到 R 中的相应主题?
- vba - 我怎样才能检查一个整数,以便如果我再次运行代码它不会检测到该值?
- python - Django - URL 的反向解析抛出“NoReverseMatch”
- javascript - 在 IE 或 Edge 中支持 Canvas “下载为图像”
- python - 将 pandas 数据框操作为所需的输出
- ruby-on-rails - 如何在不安装 Linux 子系统的情况下在 Windows 10 上运行“rails credentials:edit”
- c - 在链表中创建数据类型为“struct”的新节点
- sql-server - 使用左连接而不是联合
- list - 我如何称呼一个也支持提升的幺半群?