为何async函数返回的Proxy会被await触发.then()方法?
为什么await会触发async函数返回的Proxy对象的
then方法? 这个问题的核心在于await的工作机制和Proxy的属性拦截特性,咱们一步步拆解:
1. Async函数的返回值本质
首先,你写的p是一个async函数,不管它return什么值,JS引擎都会自动把它包装成一个Promise对象。也就是说:
async function p() { return new Proxy(...) } // 等价于 function p() { return Promise.resolve(new Proxy(...)) }
所以当你调用p()时,得到的是一个最终会resolve到那个Proxy对象的Promise。
2. Await的处理逻辑
当你使用await时,JS引擎会做两件关键的事:
- 先等待右侧的Promise完成,拿到它resolve后的结果(也就是你的Proxy对象)。
- 接着,JS引擎会检查这个结果是否是thenable对象(即拥有
then方法的对象)——这是Promise.resolve的内置逻辑,哪怕是同步值,await也会通过Promise.resolve来处理,而这个方法会优先检查目标值是否是thenable,如果是,就会调用它的then方法来接管异步流程。
3. Proxy的get拦截触发
正是第二步的检查过程,导致了你的Proxy的get陷阱被触发:
JS引擎尝试访问Proxy对象的then属性,以此判断它是不是thenable。而你的Proxy设置了get拦截器,只要有任何属性被访问(包括then),就会执行console.log(property),所以你会看到控制台输出then。
验证示例
你可以直接测试访问Proxy的then属性,同样会触发拦截:
const proxy = new Proxy({}, { get: (target, prop) => console.log(prop) }); proxy.then; // 控制台输出"then"
总结一下:不是await主动调用了then方法,而是它在处理结果时,需要检查目标对象是否为thenable,从而触发了Proxy对then属性的访问拦截。
内容的提问来源于stack exchange,提问作者millsp
相关产品推荐
相关产品推荐

