为什么我无法从第一个请求 vert.x 获得结果?

Why I couldn't get the result from the first request vert.x?

public class Ussd {

    private static Logger logger = LogManager.getLogger(Ussd.class);
    private  static  String query;

    public static void ussdMessages(RoutingContext routingContext){
        String codeService = routingContext.getBodyAsJson().getString("codeService");
        query=getServiceQuery(codeService);
        System.out.println("Query : "+query);
    }

    public  static String  getServiceQuery(String codeService){
        JsonObject params = new JsonObject();
        params.put("QUERY", Queries.DB_SELECT_SERVICE_QUERY);
        params.put("PARAMS", new JsonArray().add(codeService));
        System.out.println(params);
        DB.select(params, res -> {
            if (res.succeeded()) {
               query = res.result().getJsonArray("results").getJsonArray(0).getString(0);
                System.out.println(query);
            } else {
                query = res.cause().getMessage();
            }
        });
        return query;
    }
}

方法 getServiceQuery returns 我的确切结果,我将其存储到静态查询中,但在方法 ussdMesages 中调用后,它 returns 来自第一个请求的空值使用邮差。对于第二个请求,它 returns 是正确的结果。不知道为什么。

您的 getServiceQuery 方法执行异步工作 (DB.select),因此在您的情况下,您是在处理查询之前 returning 查询。将函数的 return 类型从 String 更改为 Future。

public class Ussd {

    private static Logger logger = LogManager.getLogger(Ussd.class);
    private  static  String query;

    public static void ussdMessages(RoutingContext routingContext){
        String codeService = routingContext.getBodyAsJson().getString("codeService");
        getServiceQuery(codeService).setHandler(r -> {
                System.out.println("query : "+r.result());
            });
    }

    public static Future<String> getServiceQuery(String codeService){
        Future<String> future = Future.future();
        JsonObject params = new JsonObject();
        params.put("QUERY", Queries.DB_SELECT_SERVICE_QUERY);
        params.put("PARAMS", new JsonArray().add(codeService));
        System.out.println(params);
        DB.select(params, res -> {
            if (res.succeeded()) {
               query = res.result().getJsonArray("results").getJsonArray(0).getString(0);
                System.out.println(query);
                future.complete(query);
            } else {
                future.fail(res.cause().getMessage());
            }
        });
        return future;
    }
}