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();
添加回答
舉報