您好,欢迎访问沃航(武汉)科技有限公司官方网站
解决java回调地狱的方法
2019-06-27 00:01:51

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


文章作者:沃航科技

联系我们
地址:
武汉市洪山区蓝晶国际7栋903
QQ:
932773931
电话:
027-59761089-806
手机:
13397158231
邮箱:
jevian_ma@worldflying.cn
×
物联网组态平台
试用账号:123456
试用密码:123456
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn
×
积木编程平台
试用方式:试用手机号码注册即可使用
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn