我想为 .Net 类制作一个通用代理,包括使用 Proxy 类。但是难点是我无法理解什么时候作为方法调用,什么时候通过属性调用
例如,您需要联系,例如通过 http 到服务。传递密钥、方法名称、参数并获取响应作为密钥和结果
但它看起来像这样
let res = await this.counter.proxy.AllHello1("Всем Привет");
所有的序列化都发生在Proxy get中,反序列化发生在传递key和result的事件中
对于属性,您需要返回一个 Promise
对于方法,您需要返回创建 Promise 的函数
class CounterComponent {
public currentCount: any;
public dictionary = {};
public proxy: any;
constructor() { this.SetProxy(); }
private GetPromise(name: PropertyKey,args)
{
let key = Guid.newGuid();
let promise = new Promise((resolve, reject) => {
let item = new Item(resolve, args, name);
this.dictionary[key] = item;
});
return promise;
}
private SetProxy(): void {
let self=this;
this.proxy = new Proxy({}, {
get: function(rcvr: any, name: PropertyKey)
{
// Для свойства нужно вернуть Promise
if (name == "AllHello3")
return self.GetPromise(name, []);
// А для Метода нужно вернуть функцию создающую Promise
return (...args) => {
return self.GetPromise(name,args)
};
}
});
}
public async CallMethodAsync() {
this.currentCount = await this.proxy.AllHello("Всем Привет");
}
public setResult(): void {
let key: string;
for (let name in this.dictionary) {
key = name;
}
let item = <Item>this.dictionary[key];
delete this.dictionary[key];
item.resolve(item.value);
}
}
相应地调用
console.log('before async result ');
let res = await this.counter.proxy.AllHello1("Всем Привет");
console.log('Всем привет ' + res);
res = await this.counter.proxy.AllHello2();
console.log('func ' + res);
res = await this.counter.proxy.AllHello3;
console.log('property ' + res);
代理无法确定调用函数、字段或属性。
如果您查看规范中代理方法的算法
get,您会发现如果传递给第二个参数的对象的构造函数中没有属性,get则只需尝试通过以下方式获取目标对象的属性给定的名称。如果指定了 get 属性,则只执行相应的函数,即:
this设置为作为第二个参数传递给构造函数的对象这表明在调用
get时,不知道将如何进一步使用生成的属性。在问题中的情况下,什么时候
target是一个虚构的空对象,Proxy 无法以任何方式分别确定请求的属性是什么,它无法处理各种情况:属性、字段、函数。