返回列表

async getter

默认分类 2016/12/06 19:40

一直觉得PHP中的魔术方法(Magic Method)很有用,可以实现类似JAVA反射的机制,在一个方法定义之前就可以调用而不报异常,实现基于接口和协议的编程;看了下ES6中Proxy可以实现类似机制,深入研究发现getter方法是synchronous而非asynchronous,尝试使用async/generator包装均失败后,经过反思,发现只有一种方式实现async的getter,而且仅限于方法,属性无能为力。

为什么会想到使用async的getter来获取属性呢,前端经常会遇到这样一种场景,我们引入一个库,只会使用到其中有限的功能,如果能在用到时再异步获取然后返回,就可以实现真真的按需调用,不过性能是个大问题,而且缺少语言层面支持。研究发现,ES6中Promise是实现异步的主要方法,因此可以基于Promise实现方法的async的getter,代码如下:

var f = (i) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // console.log(99999);
            resolve(i + i);
        }, 2000);
    });
};

var aa = {
    getkk () {
        return new Promise((resolve, reject) => {
            resolve(123);
        })
    }
};

var obj = new Proxy(aa, {
    get (target, key, reciever) {
        if (target[key]) return target[key];
        else return () => { return f(key); };
    }
});

obj.getkk().then((res) => {
    console.log('>>>>>>>>>>>>>>>> ' + res);
});
obj.getyy().then((res) => {
    console.log('>>>>>>>>>>>>>>>> ' + res);
});

注: 方法必须是Promise风格的.