亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取異步回調“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 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號