Vert.x:如何等待未来完成

msz*_*rlo 4 vert.x

有没有办法在不阻塞事件循环的情况下等待未来完成?

查询 Mongo 的用例示例:

Future<Result> dbFut = Future.future();
mongo.findOne("myusers", myQuery, new JsonObject(), res -> {
    if(res.succeeded()) {
      ...
      dbFut.complete(res.result());
    }
    else {
      ...
      dbFut.fail(res.cause());
    }
  }
  });

// Here I need the result of the DB query
if(dbFut.succeeded()) {
  doSomethingWith(dbFut.result());
}
else {
  error();
}
Run Code Online (Sandbox Code Playgroud)

我知道doSomethingWith(dbFut.result());可以移动到处理程序,但如果它很长,代码将变得不可读(回调地狱?)这是正确的解决方案吗?这是没有额外库的万能解决方案吗?

我知道 rxJava 简化了代码,但我不知道,学习 Vert.xrxJava 太多了。

我也想试一试vertx-sync。我把依赖放在pom.xml; 一切都下载正常,但是当我启动我的应用程序时,出现以下错误

maurice@mickey> java \
  -javaagent:~/.m2/repository/co/paralleluniverse/quasar-core/0.7.5/quasar-core-0.7.5-jdk8.jar \
  -jar target/app-dev-0.1-fat.jar \
  -conf conf/config.json 
Error opening zip file or JAR manifest missing : ~/.m2/repository/co/paralleluniverse/quasar-core/0.7.5/quasar-core-0.7.5-jdk8.jar
Error occurred during initialization of VM
agent library failed to init: instrument
Run Code Online (Sandbox Code Playgroud)

我知道错误通常意味着什么,但我不知道在那种情况下......我试图用谷歌搜索它,但没有找到关于将哪个清单放在哪里的任何明确解释。和以前一样,除非强制要求,否则我更喜欢一次学一件事。

那么,回到问题:有没有一种方法可以使用“基本”Vert.x 来等待事件循环中没有扰动的未来?

Mis*_*s94 5

您可以为将来在完成或失败时执行设置处理程序:

Future<Result> dbFut = Future.future();
mongo.findOne("myusers", myQuery, new JsonObject(), res -> {
    if(res.succeeded()) {
      ...
      dbFut.complete(res.result());
    }
    else {
      ...
      dbFut.fail(res.cause());
    }
  }
  });

dbFut.setHandler(asyncResult -> {
    if(asyncResult.succeeded()) {
      // your logic here
    }
});
Run Code Online (Sandbox Code Playgroud)

这是一种不阻塞事件循环的纯 Vert.x 方式

  • 这是一个过时的解决方案 (2认同)
  • 嘿 Vyacheslav :),如果您认为这是一个过时的解决方案,请随时添加新答案。 (2认同)