java - vertx 未来失败,但被视为成功()
问题描述
我有一个方法:
public void getVmsAdminToken(HttpClient httpClient, handler<AsyncResult<String>> handler) {
httpClient.postAbs(url, h -> h.bodyHandler(bh -> {
try {
switch (h.statusCode()) {
case 200:
JsonObject vmsResponse = bh.toJsonObject();
handler.handle(Future.succeededFuture(Json.encode(vmsResponse)));
break;
default:
LOG.error("VMS call failed {}", h.statusCode());
handler.handle(Future.failedFuture(500 + ""));
break;
}
} catch (Throwable t) {
LOG.error("Exception in getVmsAdminToken", t);
handler.handle(Future.failedFuture(500 + ""));
}
}))
.setTimeout(timeOutMs)
.putHeader("content-type", "application/json")
.putHeader("stub", apiKey)
.end(vehicleReqBody.encode());
}
我在以下方法调用中使用它:
private void getAdminToken(RoutingContext ctx, RedisFleetStorage storage, HttpClient httpClient) {
getVmsAdminToken(fleetId, user, vehicle, httpClient, replyVms -> {
if (reply.succeeded()) {
// why succeeded?!!
}
});
}
而且即使 getVmsToken 失败,执行也会落入if (reply.succeeded())
为什么会这样?
解决方案
You should check the same AsyncResult
object being the result of your HTTP call:
private void getAdminToken(RoutingContext ctx, RedisFleetStorage storage, HttpClient httpClient) {
getVmsAdminToken(fleetId, user, vehicle, httpClient, replyVms -> {
if (replyVms.succeeded()) {
// do you thing
}
});
}
推荐阅读
- ios - 使用应用程序组在框架中处理向核心数据的迁移?
- cordova - 离子3中未处理的承诺拒绝警告
- python - 如何获取过去 48 小时的数据 - Django
- python - Pandas:删除所有列中的所有 NaN 值
- python-3.6 - TypeError:“NoneType”对象不能从初学者迭代
- asterisk - Asterisk 15.3 与 Asterisk 14.6 '200 OK' 联系字段差异
- javascript - 使用带有 tap 和 map RxJS 运算符的函数时出现 TypeScript 类型错误?
- node.js - MongoDB 无法验证代码 18
- mysql - SailsJS 蓝图失控
- c++ - 分配给函数返回的值(右值?)不会产生编译错误