java - Vert.x 请求处理程序和阻塞数据库查询
问题描述
如何在 vert.x 中正确翻译这段代码?
通常,在春天或在带有模板引擎的简单 sevlet 中输出 html 响应我会这样做
function test(request, response) {
templatecontext tc = getContext();
init conditions
if (condition1) {
retrieve data from db ({
asyncresult -> {
tc.put("data1", data1)
})
} else if (condition2) {
other code
if (condition 2.1) {
retrieve data from db ({
asyncresult -> {
tc.put("data2", data2)
})
}
}
get other data from db and put in context
template.eval("templatefile", tc)
write to response
}
问题是,从数据库中检索数据是 asyncresult 的处理程序,所以我不能允许使用 data1 或 data2 进行模板评估,因为在不陷入回调地狱的情况下检索异步。
我还没有真正理解 rxjava2,但我觉得我正试图用勺子杀死一颗豆子。
解决方案
您可以使用futures和composition。见ComposeExample
回购vertx-examples
:
public class ComposeExample extends AbstractVerticle {
@Override
public void start() throws Exception {
Future<String> future = anAsyncAction();
future.compose(this::anotherAsyncAction)
.setHandler(ar -> {
if (ar.failed()) {
System.out.println("Something bad happened");
ar.cause().printStackTrace();
} else {
System.out.println("Result: " + ar.result());
}
});
}
private Future<String> anAsyncAction() {
Future<String> future = Future.future();
// mimic something that take times
vertx.setTimer(100, l -> future.complete("world"));
return future;
}
private Future<String> anotherAsyncAction(String name) {
Future<String> future = Future.future();
// mimic something that take times
vertx.setTimer(100, l -> future.complete("hello " + name));
return future;
}
}
推荐阅读
- javascript - 可折叠登录表单的切换按钮不会保持固定
- html - HTML 和 CSS 中的图像滑块
- python - Google colab 直接使用 Os.listdir 访问 Machine 的本地驱动器
- javascript - 为什么我使用更改流得到错误的参数
- python - 如何使模板中的python只输入一次if条件
- python - Keras Concatenate层尺寸起作用
- c# - 如果我关闭浏览器,PayPal 付款不记录交易
- kubernetes - 验证 Kubernetes 配置的方法
- android - 如何防止浏览器重定向的深层链接循环(再次打开移动应用程序)?
- ruby-on-rails - 强制客户端浏览器清除缓存