Javascript 在计算代理时调用代理获取处理程序

Javascript 在计算代理时调用代理获取处理程序,javascript,node.js,proxy,Javascript,Node.js,Proxy,我对代理的定义如下: const o1 = { ready: false }; setTimeout(() => { o1.ready = true; }, 1000000000); const handler = { get(target, propKey, receiver) { if (target.ready == false) { throw new Error('not ready'); } else {

我对代理的定义如下:

const o1 = {
      ready: false
    };

setTimeout(() => {
  o1.ready = true;
}, 1000000000);

const handler = {
  get(target, propKey, receiver) {
    if (target.ready == false) {
      throw new Error('not ready');
    } else {
      return 'ready'
    }
  }
};

const proxy = new Proxy(o1, handler);

proxy; // raises 'not ready'

评估
代理
会引发错误“未准备就绪”,即使它不是属性访问。如何防止在计算对代理的引用时引发错误?这会导致在不分配任务的情况下进行请求时出现错误。

这似乎与此错误有关:

我发现最好的解决方法是专门忽略节点检查:

const handler = {
  get(target, propKey, receiver) {
    if (propKey != util.inspect.custom && 
        propKey != 'inspect' && 
        propKey != Symbol.toStringTag){
      if (target.ready == false) {
        throw new Error('not ready');
      } else {
        return 'ready'
      }
    }
  }
};

或者,如果您知道您关心的密钥列表,那么只需检查它们,而不是排除

显然,您是在REPL中对此进行评估,其中最终的
代理语句生成代码的结果值,并记录到控制台。记录它将访问属性,这是意料之中的

但是,您确实不应该在这里使用代理。代理应该单独处理不同的属性,但您的代理似乎只关心
ready
属性。更简单的getter更合适:

const o1 = {
  ready: false
};
setTimeout(() => {
  o1.ready = true;
}, 1000000000);

const res = { // instead of the `proxy` object
  get ready() {
    if (o1.ready == false) {
      throw new Error('not ready');
    } else {
      return 'ready'
    }
  }
};

res.ready // either throws or yields the string "ready"

你在什么环境下看到这个?在chrome上进行测试,并按预期工作,编辑:刚刚在NodeNodeNodeV8.7.0中复制。我在chrome上也没有错误:/github上创建了一个问题,将用detailshmmmm更新。。。我既没有准备好,也没有准备好。代理的get处理程序用于访问代理本身的属性<代码>代理.就绪
将触发
未就绪
。但是,我看不出你的代码怎么会触发任何东西……它寻找“inspect”是一个奇怪的部分:/。谢谢