RxJava/Helidon[使异步函数按顺序运行]



我正在尝试依次运行以下三个函数:

  • void f1(String id, Handler1 handler)
  • void f2(String id,Handler2 handler)
  • void f3(String id, Handler3 handler)

单个函数的完成在相应的处理程序中传递,并在单个函数中设置。

Single<String> single = Single.just("some-random-id");
single.flatMapSingle(id -> {
Single<String> s1 = Single.just(id);
f1(id,result -> {
if(!result.success)
s1 = Single.error(result.error);
});
return s1;
}
)
.flatMapSingle(id -> {
Single<String> s2 = Single.just(id);
f2(id,result -> {
if(!result.success)
s2 = Single.error(result.error);
});
return s2;
}
)
.flatMapSingle(id -> {
Single<String> s3 = Single.just(id);
f3(id,result -> {
if(!result.success)
s3 = Single.error(result.error);
});
return s3;
}).onError(error->{
System.out.println(error.message);
});
single.get();

问题是代码没有等待结果。并且onError永远不会被触发我怎么能确保单打在flatMaps是根据结果正确初始化。成功?

首先,那些来自处理器的赋值永远不能工作;变量超出作用域,父方法可能很久以前就完成返回了。

你可以做的是使用CompletableFuture来调解回调到Single:

single.flatMapSingle(id -> {
CompletableFuture<String> future = new CompletableFuture<>();
f1(id, result -> {
if (result.success) {
future.complete(id);
} else {
future.completeExceptionally(result.error);
}
});
return Single.create(future);
})
// same pattern for f2 & f3

最新更新