一直觉得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风格的.