2.4、Vert.x的future对象和回调的说明
Vert.x的future不是JDK的future:它们可以以非阻塞的方式组合和查询。它们用于异步任务的简单协调,特别是在部署Verticle并检查它们是否已成功部署的任务中。
Vert.x core API基于回调来通知异步事件。 经验丰富的开发人员自然会认为,这打开了所谓的“回调地狱”的大门, 多层次的嵌套回调使代码难以理解,如以下虚构代码所示:
foo.a(1, res1 -> {
if (res1.succeeded()) {
bar.b("abc", 1, res2 -> {
if (res.succeeded()) {
baz.c(res3 -> {
dosomething(res1, res2, res3, res4 -> {
// (...)
});
});
}
});
}
});
虽然核心API可能被设计为有利于承诺和future,但回调的选择其实很有趣,因为它允许使用不同的编程抽象。Vert.x是一个非常不客观的项目,回调允许实现更好地处理异步编程的不同模型:反应性扩展(通过RxJava),承诺和future,fibers(使用字节码增强)等。
由于所有的Vert.x API是以回调为导向的,可以利用像RxJava这样的其他抽象,本指南仅在第一部分中使用回调,以确保读者熟悉Vert.x中的核心概念。也可以容易地从回调开始在异步代码的许多部分之间画一条线。 一旦在示例代码中显而易见的出现由于回调导致代码难以理解时,我们将引入RxJava支持,以显示如何使用处理事件流来的方式更好地表达相同的异步代码。