我有一个接口,只有一个方法返回" config"对象
我想在Android和Vertx3环境中使用这个界面。
Config retrieveConfig(String authCreds);
我试图在vertx程序中实现它,利用它的JDBC客户端,但我遇到了问题。
jdbcClient.getConnection(sqlConnResult ->
//checks for success
sqlConnResult.result().query(selectStatement, rows -> {
//get result here, want to return it as answer to interface.
//seems this is a "void" method in this scope.
});
这个界面甚至可以使用Vertx异步代码吗?
答案 0 :(得分:2)
在Async programming
中,您无法真正将您的值返回给调用者,因为这将是一个阻塞调用 - async programming
寻求删除的主要内容之一。这就是Vertx
中许多方法返回this
或void
的原因。
作为替代方案存在各种范例:
Vert.x
广泛使用Handler<T>
接口,其中handler(T result)
方法将与结果一起执行。
Vert.x 3
也支持Rx Observable
。这样您就可以返回Observable<T>
subscribers
,async task
完成后会将结果发送到Future<T>
。
此外,始终有一个选项可以返回Vert.x
,一旦异步任务完成,它将包含结果。虽然common interface
并没有真正使用它。
所以你可能会发现很难为blocking
和non-blocking api
提供Vertx
这样的代价。 Vertx 3
为run blocking code提供了简单易行的方法,但我认为这不是一个很好的解决方案。
就个人而言,我会看一下RxJava。支持Rx on Android,并且已在Config retrieveConfig(String authCreds);
中得到很好的采用 - 几乎每个API调用都有Rx equivalent。
搬离:
Observable<Config> retrieveConfig(String authCreds);
到
Android
可以让您拥有一个通用界面,并使其能够同时使用Vert.x
&amp; Rx
。它还可以带来额外的好处,即不必误入module lpm_mult (
dataa, datab, // multiplicand,multiplier
sum, // partial sum
clock, // pipeline clock
clken, // clock enable
aclr, // asynch clear
result // product
);
input clock;
input clken;
input aclr;
input [31:0] dataa;
input [31:0] datab;
input [63:0] sum;
output [63:0] result;
always @ (clken or posedge clock) begin
if (1==clken) begin
assign result = dataa * datab;
end
end
endmodule
寻求避免的回调地狱。
希望这有帮助,