同一段Promise代码在Chrome与VSCode控制台输出结果不一致是什么原因?
差异根本原因:两种控制台的对象打印逻辑不同
你对JS事件循环的理解完全正确:代码执行到console.log(p)时,setTimeout回调尚未触发,Promise此时的真实状态确实是pending,VSCode(对应Node.js运行环境)的输出是代码执行到该位置的即时真实结果。
两者输出不一致的具体原因如下:
Chrome DevTools控制台的懒求值特性
Chrome控制台打印引用类型(包括Promise、普通对象、数组等)时,默认输出的是对象的内存引用,而非执行console.log瞬间的状态快照。你看到的fulfilled状态,是你点开Promise详情查看时,已经过了1秒延迟、resolve('OK')已经执行后的状态。
你可以通过两个方法验证:一是执行代码后立刻点开控制台打印的Promise,会看到状态为pending,旁边还会出现i型提示,标注「Value below was evaluated just now」,明确说明该值是查看时才计算的,不是打印时的状态;二是在console.log(p)后立刻加debugger断点,停在断点处查看Promise状态,也会看到是pending。VSCode Node.js环境的快照打印特性
在VSCode中直接运行JS代码默认使用Node.js环境,Node的控制台打印对象时,输出的是执行console.log那一刻的对象状态快照,不会随后续对象状态变化更新,所以会直接显示pending,和代码执行的同步逻辑完全匹配。
内容的提问来源于stack exchange,提问作者Allen Ye
相关产品推荐
相关产品推荐

