在vertx指南中,链接异步调用的顺序组合如下所示:
FileSystem fs = vertx.fileSystem();
Future<Void> startFuture = Future.future();
Future<Void> fut1 = Future.future();
fs.createFile("/foo", fut1.completer());
fut1.compose(v -> {
// When the file is created (fut1), execute this:
Future<Void> fut2 = Future.future();
fs.writeFile("/foo", Buffer.buffer(), fut2.completer());
return fut2;
}).compose(v -> {
// When the file is written (fut2), execute this:
fs.move("/foo", "/bar", startFuture.completer());
},
// mark startFuture it as failed if any step fails.
startFuture);
只是我的问题还是这段代码真的很麻烦且难以阅读?
应该有另一种方法而不陷入回调 hell 。 遗憾的是,关于 vertx 的博客文章太少了,任何想法都非常感激。
最佳答案
如今,用于在 JVM 上编写异步、非阻塞代码的事实上的库是 RxJava 。如果你不熟悉,我想说它非常值得你花时间看一下,因为它的众多好处之一就是能够将“流”编写为组合流,而不是像 JDK 的 Future
那样回调 hell 。是的。
幸运的是,Vert.x 与 RxJava 集成。作为示例,以下是使用 RxJava 工件重写的代码片段:
@Override
public void start(Future<Void> startFuture) throws Exception {
final FileSystem fs = vertx.fileSystem();
fs.rxCreateFile("/foo")
.andThen(fs.rxWriteFile("/foo", Buffer.buffer()))
.andThen(fs.rxMove("/foo", "/bar"))
.subscribe(
() -> {
startFuture.complete();
},
error -> {
startFuture.fail(error);
}
);
}
更加简洁和可读。
注意:
- 使用 RxJava 2,因为它有 superceded RxJava 1
- ...然而,Vert.x 都支持这两个版本,它们各自的工件位于不同的命名空间中:
-
io.vertx.rxjava
版本 RxJava 1 工件 -
io.vertx.reactivex
版本 RxJava 2 工件
-
希望有帮助!
关于java - 官方(且丑陋的)顺序组合的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50130872/