最近小沃正在研究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也可以实现类似功能,只是还没有时间研究而已。
文章作者:沃航科技