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”是一个奇怪的部分:/。谢谢