java - 官方(且丑陋的)顺序组合的替代方案

标签 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);

只是我的问题还是这段代码真的很麻烦且难以阅读?

应该有另一种方法而不陷入回调 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/

相关文章:

Vert.x 上的 Java Rest API

Java 与 Cucumber 场景顺序

java - 如何在矩形中创建矩形?

java - 计算用户定义的年数中四个季度的降雨量

java - Spring ConversionService 添加转换器

java - vertx-x3 集群多个顶点

java - 是否可以将 ORM 与 Vert.x 一起使用?

java - 顶点 : handling POST body is so slow

java - vertx HTTPS (SSL/TLS) 服务器不工作。我无法访问 https ://localhost

java - 为什么数据库连接在几次后失败