2017-08-30 1 views
0

J'ai un code comme celui-ci, utilisez VertX-jdbc-clientComment éviter les rappels imbriqués dans Vert.x?

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? RxJava? vous pouvez utiliser celui que vous aimez, juste éviter les rappels imbriqués, merci.

+0

Ce que vous entendez par _resolve callback_ n'est pas clair pour moi. – tsegismont

+0

@tsegismont à plat l'appel de méthode – twogoods

Répondre

0

Futures fonctionne exactement comme promesses JavaScript. Créez une méthode qui retournera Future<T>, faites votre appel asynchrone dans cette méthode. Lorsque votre async est fait, il suffit d'appeler 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 fonctionne en service. Ainsi, le code ci-dessus en RX deviendra:

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

Avec API RX

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")); 
     }); 

J'ai utilisé mongoClient, mais vous pouvez faire de même avec sqlClient.

+0

Je vois aussi l'appel imbriqué, peut-il flatter l'appel de méthode? – twogoods

+0

Oui, vous pouvez le faire –

+0

Je n'ai aucune idée, pouvez-vous donner plus d'exemple de code? – twogoods