在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);
这只是我还是这段代码真的很麻烦而难以阅读?
应该有另一种方式而不会陷入回调地狱。 遗憾的是,关于vertx的博客文章很少,我们非常感谢任何想法。
答案 0 :(得分:2)
现在,用于在JVM上编写异步,非阻塞代码的事实库是RxJava。如果你不熟悉我会说你非常值得一看,因为有很多好处之一就是能够将“流”写成不像JDK那样回调的组合流。 {1}} s。。
幸运的是,Vert.x与RxJava集成在一起。例如,这是使用RxJava工件重写的代码段:
Future
更加简洁和可读。
请注意:
@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 1工件io.vertx.rxjava
版本RxJava 2工件