为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取异步回调“onResponse”的参数?

如何获取异步回调“onResponse”的参数?

Cats萌萌 2022-09-07 17:41:38
我正在使用Apollo的自动生成查询在Java应用程序中实现GraphQL客户端,到目前为止,我已经能够链接调用,并且我还获得了我想要的数据。问题是Apollo让我实现了覆盖和的匿名方法,但我无法找到一种方法来获取此对象,我想收集并确保我有。ApolloCall.Callback<>()void onResponse(Response response)void onFailure()Response这是Java 11上的一个Spring Boot项目,我试图利用它,但对它的了解有限,以及如何使用它来解决这个特定的问题,我觉得运气不好。我还尝试实现Apollo应该具有的RxJava支持,但我无法通过这种方法解决依赖问题。CompletableFuture我很确定期货会解决这个问题,但我再次不知道如何解决。  public void getOwnerIdFromClient() {    client        .query(getOwnerDbIdQuery)        .enqueue(            new ApolloCall.Callback<>() {              @Override              public void onResponse(@Nonnull Response<Optional<GetOwnerDbIdQuery.Data>> response) {                int ownerId =                    response                        .data()                        .get()                        .entities()                        .get()                        .edges()                        .get()                        .get(0)                        .node()                        .get()                        .ownerDbId()                        .get();                System.out.println("OwnerId = " + ownerId);              }              @Override              public void onFailure(@Nonnull ApolloException e) {                logger.error("Could not retrieve response from GetOwnerDbIdQuery.", e);              }            });  }由于我希望在外部与此合作,因此这不是一个足够的解决方案。我实际上想进行此调用x次,并创建一个我实际获得的所有id的列表,因为这也可能返回一个空id,这意味着我需要一些方法来等待它们全部完成。int ownerIdonResponse
查看完整描述

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;

}


查看完整回答
反对 回复 2022-09-07
?
翻过高山走不出你

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();


查看完整回答
反对 回复 2022-09-07
  • 2 回答
  • 0 关注
  • 66 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信