2017-08-30 77 views
0

我有一些像这样的代码,使用vertx-JDBC客户端如何避免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()); 
       }); 
      }); 
     }); 

FutureRxJava?你可以使用任何你喜欢的,只是避免嵌套的回调,谢谢。

+0

我不清楚你的意思是_resolve callback_。 – tsegismont

+0

@tsegismont扁方法调用 – twogoods

回答

0

期货的工作原理与JavaScript承诺完全相同。创建一个返回Future<T>的方法,在这个方法中进行异步调用。当你异步完成后,只需拨打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适用于流。因此,在RX上面的代码将变为:

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

随着我已经使用mongoClient RX的API

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

,但你可以做sqlClient相同。

+0

我也看到了嵌套调用,可以调用方法吗? – twogoods

+0

是的,你可以这样做 –

+0

我不知道,你可以给更多的示例代码? – twogoods