2017-08-30 1 views
0

Ich habe einige Code wie diesen, VertX-jdbc-ClientWie verschachtelte Rückrufe in Vert.x zu vermeiden?

client.getConnection(res -> { 
      SQLConnection connection = res.result(); 
      connection.query("SELECT count(1) FROM T_User", res2 -> { 
       connection.query("SELECT count(1) FROM T_Book", res3 -> { 
        System.out.println(res2.result().getRows() + "--" + res3.result().getRows()); 
       }); 
      }); 
     }); 

Future verwenden? RxJava? Sie können jeden benutzen, den Sie mögen, vermeiden Sie einfach verschachtelte Rückrufe, danke.

+0

Es ist mir nicht klar, was Sie mit _resolve Callback_ meinen. – tsegismont

+0

@tsegismont flach der Methodenaufruf – twogoods

Antwort

0

Futures funktioniert genau das gleiche wie JavaScript verspricht. Erstellen Sie eine Methode, die Future<T> zurückgibt, führen Sie Ihren Async-Aufruf in dieser Methode aus. Wenn Ihr async getan wird, rufen Sie einfach future.complete(<T>)

Future<JsonObject> getUsers(){ 
    Future<JsonObject> future = Future.future(); 
    client.getConnection(res -> { 
     SQLConnection connection = res.result(); 
     connection.query("SELECT count(1) FROM T_User", res2 -> { 
      connection.query("SELECT count(1) FROM T_Book", res3 -> { 
       JsonObject rows = new JsonObject().put("res2",res2.result().getRows()).put("res2",res3.result().getRows()); 
       future.complete(rows); 
       // In exception block, you can add 
       // future.fail(Throwable); 
      }); 
     }); 
    }); 
    return future; 
} 

RX auf Strom funktioniert. So ist der obige Code in RX wird geworden:

Observable<JsonObject> getUsers(){ 
    return Observable.create(subscriber -> { 
     client.getConnection(res -> { 
      SQLConnection connection = res.result(); 
      connection.query("SELECT count(1) FROM T_User", res2 -> { 
       connection.query("SELECT count(1) FROM T_Book", res3 -> { 
        JsonObject rows = new JsonObject().put("res2",res2.result().getRows()).put("res2",res3.result().getRows()); 
        subscriber.onNext(rows); 
        subscriber.onCompleted(); 
       }); 
      }); 
     }); 

    }, Emitter.BackpressureMode.NONE); 
} 

Mit RX APIs

Observable<Long> userCount = mongoClient.rxCount("users", query).toObservable(); 
Observable<Long> booksCount = mongoClient.rxCount("books", query).toObservable(); 


Observable 
     .zip(userCount, booksCount, (userRes, booksRes) -> 
       new JsonObject().put("user",userRes).put("books",booksRes) 
     ) 
     .subscribe(objects -> { 
      System.out.println(objects.getString("user")); 
      System.out.println(objects.getString("books")); 
     }); 

I mongoClient verwendet haben, aber Sie können mit sqlClient gleiche tun.

+0

Ich sehe auch den verschachtelten Anruf, kann die Methode aufrufen? – twogoods

+0

Ja, Sie können das tun –

+0

Ich habe keine Ahnung, können Sie mehr Beispielcode geben? – twogoods

Verwandte Themen