2 回答
TA贡献2019条经验 获得超9个赞
你是对的,这可以使用期货来完成:
将返回类型更改为“未来”
在 on 响应中完成未来
大约:
public Future<Integer> getOwnerIdFromClient(){
Future<Integer> result=new CompletableFuture<Integer>();
client
.query(getOwnerDbIdQuery)
.enqueue(
new ApolloCall.Callback<>(){
@Override
public void onResponse(@Nonnull Response<Optional<GetOwnerDbIdQuery.Data>>response){
// get owner Id
System.out.println("OwnerId = "+ownerId);
result.complete(ownerId)
}
@Override
public void onFailure(@Nonnull ApolloException e){
logger.error("Could not retrieve response from GetOwnerDbIdQuery.",e);result.completeExceptionally(e);
}
});
return result;
}
TA贡献1875条经验 获得超3个赞
如果其他人遇到这种情况,我花了很长时间才弄清楚泛型,但是您可以通过使用以下函数作为单独的类或包装器来以通用方式执行此操作(以避免所有不同查询类型的复制/粘贴):
private <D extends Operation.Data, T, V extends Operation.Variables> CompletableFuture<T> execute(Query<D, T, V> query) {
CompletableFuture<T> future = new CompletableFuture<>();
client.query(query).enqueue(new ApolloCall.Callback<>() {
@Override
public void onResponse(@NotNull Response<T> response) {
if (response.hasErrors()) {
String errors = Objects.requireNonNull(response.getErrors()).stream().map(Object::toString).collect(Collectors.joining(", "));
future.completeExceptionally(new ApolloException(errors));
return;
}
future.complete(response.getData());
}
@Override
public void onFailure(@NotNull ApolloException e) {
future.completeExceptionally(e);
}
});
return future;
}
那么它应该只是一个打电话的情况
Integer myResult = execute(getOwnerDbIdQuery).get();
添加回答
举报