官方(和丑陋)顺序组合的替代品

时间:2018-05-02 09:07:13

标签: java vert.x

在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的博客文章很少,我们非常感谢任何想法。

1 个答案:

答案 0 :(得分:2)

现在,用于在JVM上编写异步,非阻塞代码的事实库是RxJava。如果你不熟悉我会说你非常值得一看,因为有很多好处之一就是能够将“流”写成不像JDK那样回调的组合流。 {1}} s。。

幸运的是,Vert.x与RxJava集成在一起。例如,这是使用RxJava工件重写的代码段:

Future

更加简洁和可读。

请注意:

  • 使用RxJava 2,因为它有superceded RxJava 1
  • ...但是,Vert.x支持这两个版本,它们各自的工件存放在不同的命名空间中:
    • @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工件
希望有所帮助!