2017-08-30 5 views
0

私はこのようないくつかのコードを持って、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 VERTX-JDBCクライアントを使うのか? RxJava?好きなものを使うことができます。ネストされたコールバックは避けてください。

+0

_resolveコールバックが意味することは私には分かりません。 – tsegismont

+0

@tsegismontフラットメソッド呼び出し – twogoods

答えて

0

未来はJavaScriptの約束と全く同じです。 Future<T>を返すメソッドを作成し、このメソッドで非同期呼び出しを行います。あなたの非同期が完了すると、ちょうどRXは、ストリーム上で動作します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上記のコードでは、なります:

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

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

で、私はmongoClientを使用しているが、あなたはsqlClientと同じことを行うことができます。

+0

私はまた、ネストされた呼び出しを参照してくださいフラットメソッド呼び出し? – twogoods

+0

はい、あなたはそれを行うことができます –

+0

私は考えていない、より多くのサンプルコードを与えることができますか? – twogoods

関連する問題