gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:10:13 25 4
gpt4 key购买 nike

在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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com