最近小沃正在研究vert.x框架,这套基于netty的框架,大量使用了异步IO,因此在并发性能上比类似tomcat这类框架要高得多,但是高性能也带来了一些麻烦,那就是大量使用了回调函数。由于大量使用了回调函数。当需要回调嵌套时,就会陷入回调地狱,之前使用nodejs时,有Promise,同时还有类似async与await等方式,但是在vert.x中,包括java8中都没有类似的方法。
没办法,小沃就只有自己写一个java版本的Promise类了。
考虑到实际使用很有可能是如下结构:new Promise() {
@Override
public void run(int n) {
System.out.println("hello1 n:" + n);
this.resovle(1);
}
}.then(new Promise() {
@Override
public void run(int n) {
System.out.println("hello2 n:" + n);
this.resovle(2);
}
}).then(new Promise() {
@Override
public void run(int n) {
System.out.println("hello3 n:" + n);
this.resovle(3);
}
}).then(new Promise() {
@Override
public void run(int n) {
System.out.println("hello4 n:" + n);
}
}).end();
因此需要先注册完毕最后的一个then,然后再一个一个执行里面的方法。
下面是我自己写的一个Promise.java文件public abstract class Promise {
private Promise lastPromise = null;
private Promise beforePromise = null;
public void end () {
if (beforePromise != null) {
beforePromise.end();
} else { // 寻找第一个Promise对象,然后执行它
run(0);
}
}
public Promise then (Promise lastPromise) {
if (lastPromise == null) {
end ();
return null;
}
this.lastPromise = lastPromise; // 赋值当前的Promise对象下一个Promise对象引用
lastPromise.beforePromise = this; // 赋值下一个Promise对象,它的上一个对象引用
return lastPromise;
}
public void resovle (int n) { // 这里的n是一个参数用户传递给下一个run,根据需求类型可以更改
if (lastPromise == null) {
return;
}
beforePromise = null; // 将上一个Promise的指针置空,方便gc回收
lastPromise.run(n); // 执行下一个Promise的run方法
}
public abstract void run(int n); // 这里的类型要与resovle的类型一致
}
在需要回调的地方使用这个方式,会简化代码编写难度。听说java的rxjava也可以实现类似功能,只是还没有时间研究而已。
文章作者:沃航科技