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

我正在使用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


Cats萌萌
浏览 104回答 2
2回答

慕少森

你是对的,这可以使用期货来完成:将返回类型更改为“未来”在 on 响应中完成未来大约:public Future<Integer> getOwnerIdFromClient(){&nbsp; &nbsp; Future<Integer> result=new CompletableFuture<Integer>();&nbsp; &nbsp; client&nbsp; &nbsp; .query(getOwnerDbIdQuery)&nbsp; &nbsp; .enqueue(&nbsp; &nbsp; new ApolloCall.Callback<>(){&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onResponse(@Nonnull Response<Optional<GetOwnerDbIdQuery.Data>>response){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // get owner Id&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("OwnerId = "+ownerId);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.complete(ownerId)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onFailure(@Nonnull ApolloException e){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.error("Could not retrieve response from GetOwnerDbIdQuery.",e);result.completeExceptionally(e);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; return result;}

翻过高山走不出你

如果其他人遇到这种情况,我花了很长时间才弄清楚泛型,但是您可以通过使用以下函数作为单独的类或包装器来以通用方式执行此操作(以避免所有不同查询类型的复制/粘贴):&nbsp; &nbsp; private <D extends Operation.Data, T, V extends Operation.Variables> CompletableFuture<T> execute(Query<D, T, V> query) {&nbsp; &nbsp; CompletableFuture<T> future = new CompletableFuture<>();&nbsp; &nbsp; client.query(query).enqueue(new ApolloCall.Callback<>() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onResponse(@NotNull Response<T> response) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (response.hasErrors()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String errors = Objects.requireNonNull(response.getErrors()).stream().map(Object::toString).collect(Collectors.joining(", "));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; future.completeExceptionally(new ApolloException(errors));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; future.complete(response.getData());&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onFailure(@NotNull ApolloException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; future.completeExceptionally(e);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; });&nbsp; &nbsp; return future;}那么它应该只是一个打电话的情况Integer myResult = execute(getOwnerDbIdQuery).get();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java