我正在生成一个值(使用uuid java的6个字母数字字母)并在数据库已经存在的情况下再次检查它。如果该值已经存在于db中,则生成新值并再次检查该值是否存在(依此类推)。以同步方式(java),我可以这样做:
String voucher = this.genereatevoucher();
while(this.valuexists(voucher )){
test = this.genereatevoucher();
}
请注意,this.valuexists
方法检查数据库中是否存在该值,然后返回true或false。但在vertx中,查询数据库的常用方法是:
client.getConnection(res -> {
if (res.succeeded()) {
SQLConnection connection = res.result();
connection.query("SELECT * FROM some_table", res2 -> {
if (res2.succeeded()) {
ResultSet rs = res2.result();
// Do something with results
}
});
} else {
// Failed to get connection - deal with it
}
});
我无法将上面的代码放在我的方法上,因为它是异步执行的,所以我的方法总是返回true / false(基于初始赋值)。如何(可能)在vertx中进行数据库查询循环?
答案 0 :(得分:3)
您可以将逻辑放在一个再次调用自身的方法中,直到找不到匹配的行:
generateVoucher(handler);
其中handler
是在找不到匹配行或数据库查询失败时要调用的代码。
然后方法实现如下:
private void generateVoucher(Handler<AsyncResult<String>> handler) {
String myId = ....;
client.getConnection(res -> {
if (res.succeeded()) {
SQLConnection connection = res.result();
connection.queryWithParams(myQuery, new JsonArray().add(myId), res2 -> {
if (res2.succeeded()) {
ResultSet rs = res2.result();
boolean inDb = checkAlreadyInDb(rs);
connection.close();
if (inDb) {
generateVoucher(handler);
} else {
handler.handle(Future.succeededFuture(myId));
}
} else {
handler.handle(Future.failedFuture(res2.cause));
}
});
} else {
handler.handle(Future.failedFuture(res.cause));
}
});
}