这是一个最小的例子:
// Construct a proxy handler with noop getter and setter
const handler = {
get (target, name) { console.error('Getter ' + name + ' should not be called') },
set (target, name, value) { console.error('Setter ' + name + ' should not be called') }
}
// Create a proxy using the handler
const proxy = new Proxy({}, handler)
// Resolve a promise with the new proxy
const promise = new Promise((resolve, reject) => {
resolve(proxy)
})
// Access the proxy from the promise, and the getter for 'then' on the proxy
// is called, not the 'then' method on the promise as expected
promise.then((proxy) => proxy)
一个可运行的例子:https://runkit.com/molovo/possible-promise-proxy-bug
在我看来,对then
的调用是访问Promise
上的属性,因此在上面的示例中永远不应该访问Proxy
上的getter。这是预期的行为,还是一个错误?并且,如果是预期的,为什么?
答案 0 :(得分:3)
promise.then本身就好了,并没有调用代理。例如,添加以下代码行,您将看不到代理的其他用途:
const temp = promise.then;
相反,这取决于承诺的规范。当您致电resolve(proxy)
时,部分承诺解决程序包括检查proxy.then
的值。然后根据proxy.then是否为函数,它会影响解析过程的继续。由于正在访问proxy.then,因此您将看到日志语句。
见Promise A+ spec第2.3节,特别是第2.3.3.1小节