Java *Vert.x*:如何在同步代码中处理
我有一个方法,可以有条件地进行异步调用。下面是它的简化版本。如果“条件”满足,我希望它返回Java *Vert.x*:如何在同步代码中处理,java,future,vert.x,Java,Future,Vert.x,我有一个方法,可以有条件地进行异步调用。下面是它的简化版本。如果“条件”满足,我希望它返回 private void myMethod(RoutingContext RoutingContext,Handler){ //... 如果(条件){ //这行不通 handler.handle(Future.succeededFuture(new AsyncReply(200,“”)); } //在这里,我执行一个异步调用,并适当地使用处理程序 HttpClientRequest productRequ
private void myMethod(RoutingContext RoutingContext,Handler){
//...
如果(条件){
//这行不通
handler.handle(Future.succeededFuture(new AsyncReply(200,“”));
}
//在这里,我执行一个异步调用,并适当地使用处理程序
HttpClientRequest productRequest=client.getAbs(url,h->h.bodyHandler(bh->{
//工作
handler.handle(Future.succeededFuture(new AsyncReply(200,“”));
}
}
我该怎么做呢?根据文档,您不能直接从事件循环调用阻塞操作,因为这会阻止它执行任何其他有用的工作。那么您该怎么做呢 它是通过调用ExecuteBlock来完成的,指定要执行的阻塞代码和在执行阻塞代码时要异步回调的结果处理程序
vertx.executeBlocking(future -> {
// Call some blocking API that takes a significant amount of time to return
String result = someAPI.blockingMethod("hello");
future.complete(result);
}, res -> {
System.out.println("The result is: " + res.result());
});
根据文档,您不能直接从事件循环调用阻塞操作,因为这会阻止它执行任何其他有用的工作。那么您如何做到这一点呢 它是通过调用ExecuteBlock来完成的,指定要执行的阻塞代码和在执行阻塞代码时要异步回调的结果处理程序
vertx.executeBlocking(future -> {
// Call some blocking API that takes a significant amount of time to return
String result = someAPI.blockingMethod("hello");
future.complete(result);
}, res -> {
System.out.println("The result is: " + res.result());
});
结果是我错过了异步编程的基础知识 在成功的未来到来后,“回归”就足够了 否则,代码将继续执行并进行调用
private void myMethod(RoutingContext routingContext, Handler<AsyncResult<AsyncReply>> handler) {
//...
if (condition) {
// this does not work
handler.handle(Future.succeededFuture(new AsyncReply(200, "")));
return; // !!!!!
}
// here I do an async call and use the handler appropriately
HttpClientRequest productRequest = client.getAbs(url, h -> h.bodyHandler(bh -> {
// works
handler.handle(Future.succeededFuture(new AsyncReply(200, "")));
}
}
private void myMethod(RoutingContext RoutingContext,Handler){
//...
如果(条件){
//这行不通
handler.handle(Future.succeededFuture(new AsyncReply(200,“”));
返回;//!!!!!
}
//在这里,我执行一个异步调用,并适当地使用处理程序
HttpClientRequest productRequest=client.getAbs(url,h->h.bodyHandler(bh->{
//工作
handler.handle(Future.succeededFuture(new AsyncReply(200,“”));
}
}
原来我缺少异步编程的基础知识
在成功的未来到来后,“回归”就足够了
否则,代码将继续执行并进行调用
private void myMethod(RoutingContext routingContext, Handler<AsyncResult<AsyncReply>> handler) {
//...
if (condition) {
// this does not work
handler.handle(Future.succeededFuture(new AsyncReply(200, "")));
return; // !!!!!
}
// here I do an async call and use the handler appropriately
HttpClientRequest productRequest = client.getAbs(url, h -> h.bodyHandler(bh -> {
// works
handler.handle(Future.succeededFuture(new AsyncReply(200, "")));
}
}
private void myMethod(RoutingContext RoutingContext,Handler){
//...
如果(条件){
//这行不通
handler.handle(Future.succeededFuture(new AsyncReply(200,“”));
返回;//!!!!!
}
//在这里,我执行一个异步调用,并适当地使用处理程序
HttpClientRequest productRequest=client.getAbs(url,h->h.bodyHandler(bh->{
//工作
handler.handle(Future.succeededFuture(new AsyncReply(200,“”));
}
}
不确定问题是什么。你是在问如何一个接一个地运行异步调用吗?事实上,我忘了详细说明并去吃午饭:)现在更新了,并回答了..谢谢!不确定问题是什么。你是在问如何一个接一个地运行异步调用吗?事实上,我忘了详细说明并去吃午饭:)现在更新,并回答..谢谢!