这是一个最小的示例:

// 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上的吸气剂。这是预期的行为还是错误?而且,如果可以预期,为什么?

最佳答案

promise.then本身就很好,并且不调用代理。例如,添加以下代码行,您将看不到代理的其他用途:

const temp = promise.then;


相反,这取决于承诺的规范。调用resolve(proxy)时,承诺解决过程的一部分包括检查proxy.then的值。然后,根据proxy.then是否为函数,它会影响解析过程的继续方式。由于正在访问proxy.then,因此您会看到日志语句。

参见Promise A+ spec的2.3节,尤其是2.3.3.1节

关于javascript - 为什么要通过代理解决 promise ,然后调用“然后”来访问代理的getter?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46196190/

10-16 21:41