如何使 JavaScript Proxy 的处理程序方法成为异步函数?
How to make JavaScript Proxy's handler methods to be async functions?
参考有关 Proxy()
的 Mozilla 文档
一个简单的代理示例:
const handler = {
get: function(target, prop, receiver) {
return Reflect.get(target, prop, receiver);
},
set: function(target, prop, receiver) {
return Reflect.set(target, prop, receiver);
}
};
const proxy = new Proxy(target, handler);
我在get
和set
中有一些异步函数,所以我想让get
和set
成为async
函数。
我希望是这样的:
const handler = {
get: async function(target, prop, receiver) {
await foo();
return Reflect.get(target, prop, receiver);
},
set: async function(target, prop, receiver) {
await bar();
return Reflect.set(target, prop, receiver);
}
};
const proxy = new Proxy(target, handler);
await (proxy.prop1 = xxx);
yyy = await proxy.prop2;
我怎样才能实现我的目标?谢谢!
这是不可能的。赋值表达式 proxy.property = value
总是 1 的计算结果为 value
,而不是代理的 set
陷阱的某些 return 值。你不能使它 return 成为 await
可行的承诺。
1: 除非赋值,包括代理陷阱,当然抛出异常。
参考有关 Proxy()
的 Mozilla 文档一个简单的代理示例:
const handler = {
get: function(target, prop, receiver) {
return Reflect.get(target, prop, receiver);
},
set: function(target, prop, receiver) {
return Reflect.set(target, prop, receiver);
}
};
const proxy = new Proxy(target, handler);
我在get
和set
中有一些异步函数,所以我想让get
和set
成为async
函数。
我希望是这样的:
const handler = {
get: async function(target, prop, receiver) {
await foo();
return Reflect.get(target, prop, receiver);
},
set: async function(target, prop, receiver) {
await bar();
return Reflect.set(target, prop, receiver);
}
};
const proxy = new Proxy(target, handler);
await (proxy.prop1 = xxx);
yyy = await proxy.prop2;
我怎样才能实现我的目标?谢谢!
这是不可能的。赋值表达式 proxy.property = value
总是 1 的计算结果为 value
,而不是代理的 set
陷阱的某些 return 值。你不能使它 return 成为 await
可行的承诺。
1: 除非赋值,包括代理陷阱,当然抛出异常。