JavaScript代理在“上返回异步值”;获得;

JavaScript代理在“上返回异步值”;获得;,javascript,asynchronous,proxy,Javascript,Asynchronous,Proxy,我有一些从web服务器获取的对象。对象的某些属性需要额外的异步解析,但出于性能原因,我希望延迟解析。我试图使用代理拦截访问,然后在访问时解析属性。我的处理者看起来像这样 class-MyClass{ 类型(){ 返回“我的新班级”; } } 让myObject=newmyClass(); 让proxy=新代理(myObject{ get:async(目标、道具、接收器)=>{ 如果(属性==“属性”){ 让newProp=prop+“_parsed”; 如果(!(目标中的newProp)){

我有一些从web服务器获取的对象。对象的某些属性需要额外的异步解析,但出于性能原因,我希望延迟解析。我试图使用代理拦截访问,然后在访问时解析属性。我的处理者看起来像这样

class-MyClass{
类型(){
返回“我的新班级”;
}
}
让myObject=newmyClass();
让proxy=新代理(myObject{
get:async(目标、道具、接收器)=>{
如果(属性==“属性”){
让newProp=prop+“_parsed”;
如果(!(目标中的newProp)){
return wait(新承诺((解析,拒绝)=>{resolve(“解析值”)});
}
否则{
返回目标[newProp];
}
}
否则{
返回Reflect.get(目标、道具、接收者);
}
},
});
console.log(proxy.attribute);//“解析值”
console.log(proxy.type());//“我的新类”
您不能(不应该)对
get
陷阱使用
async
方法。这些总是返回承诺,您希望
。键入
返回函数。你会想用

async function parseValue() {
  await new Promise(resolve => setImmediate(resolve));
  return "parsed value";
}
let proxy = new Proxy(myObject, {
  get(target, prop, receiver) {
    if (prop === "attribute") {
      let newProp = prop + "_parsed";
      if (!(newProp in target)) {
        target[newProp] = parseValue();
      }
      return target[newProp];
    } else {
      return Reflect.get(target, prop, receiver);
    }
  },
});

感谢您的回复,但请注意,我这样做的全部原因是为了避免“console.log”中的“wait”。在我的实际应用程序中,这个值将在自定义模板中使用,我想对创建模板的用户隐藏异步行为。代理提供了一个很好的方法来拦截对属性的请求,但是我在隐藏异步特性方面遇到了困难。在搜索和尝试了不同的东西(如“deasync”)之后,我基本上到达了我需要接受的事实,即需要在那里调用“wait”。我找不到一种干净/安全的方法来强制异步命令进入类似同步的接口。“require(“deasync”).sleep(delay);”是我得到的最接近的值,但它似乎不安全您不能用代理和/或
异步函数隐藏异步行为。在javascript中,您应该采用异步,而不是强制执行同步
deasync
确实是一种可怕的黑客行为,它会导致unidiomatic和code。
…
console.log(await proxy.attribute);
console.log(proxy.type());