一、多个回调如何避免回调地域
方法:使用compose与Future
示例1:按顺序执行里面的回调方法
//回调方法1
private Future<boolean> getStatus1(String id) {
return Future.future(f -> {
f.complete(true);
});
}
//回调方法2
private Future<boolean> getStatus2(boolean id) {
return Future.future(f -> {
f.complete(false);
});
}
Future.<Void>succeededFuture()
.compose(v1 -> {
getStatus1("1")
})
.compose(v2 -> {
//现在这个v2 就代表getStatus1方法的返回值
getStatus1(v2)
}).onComplete(a -> {
//现在这个a 值为 false
if (a.succeeded()) {
//end
}else{
//end
}
})
示例2: CompositeFuture 顺序执行/无序执行
//回调方法1
private Future<boolean> getStatus1(String id) {
return Future.future(f -> {
f.complete(true);
});
}
//回调方法2
private Future<boolean> getStatus2(boolean id) {
return Future.future(f -> {
f.complete(false);
});
}
List<Future> futures = new ArrayList<Future>(2);
futures.add(getStatus1("1"));
futures.add(getStatus1(true));
//join代表异步并发执行
//all代表按顺序执行,先执行
CompositeFuture.join(futures).onComplete(ar -> {
if(ar.succeeded()) {
CompositeFuture res = ar.result();
boolean b1 = res.resultAt(0);//true
boolean b2 = res.resultAt(1);//false
}else{
//error
}
});
二.执行需要阻塞(io)的操作
vertx.executeBlocking(f -> {
f.complete(res);
});
三.执行定时任务
public void start(Promise<Void> startFuture) {
vertx.setPeriodic(3600 * 500, keys -> {
//半小时更新一次
getSetKeys();
});
}
四.全局的安全的异步map
private static AsyncMap<Object, Object> timeline = null;
//初始化
vertx.sharedData().getAsyncMap("Timeline", resultHandler ->{
timeline = resultHandler.result();
});
//使用
timeline.get(id, resultHandler -> {
JsonObject vinfo = (JsonObject) resultHandler.result();
});