Javascript Promise 和事件循环

Javascript Promise & event loop

我在 Chrome 上尝试了 运行 以下代码,但得到了意想不到的结果。

<script>
    let p = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('OK');
        }, 1000)
    })
    console.log(p);
</script>

Chrome 控制台上打印的 Promise 对象是 enter image description here。 (state='fulfilled', result='OK)

但是 VScode 控制台上打印的 Promise 对象是 enter image description here。 (状态='pending',结果=未定义)

根据我对 JS 事件循环的了解,由于 setTimeout() 是异步的,代码“resolve('OK')”在同步代码完成之前不会执行。

所以我认为 VScode 结果是我应该期待的,对吗?但是是什么导致了 Chrome 和 VScode 之间的不同结果呢?谢谢^^

请注意 Chrome 控制台上的 console.log 会向您显示最新版本的变量

这不一定与程序实际运行时的值相同。

所以我们遇到了这种奇怪的情况。在 Chrome 控制台中试试这个。

let p = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('OK');
    }, 1000)
})
console.log("Value at time of running", JSON.stringify(p))
console.log("Value at time of seeing", p);

下面是我看到的。我正在粘贴它,因为我无法通过 Stack Overflow 的“片段”功能重现它。

这是什么意思

第二个 console.log 产生了令人困惑的外观。它的摘要(带有向下箭头)表示它是 pending。但是下面的详细信息说它是 fulfilled.

单击蓝色的“i”按钮会提供一些信息。我不能轻易地将它复制并粘贴到这里,但它说的是“左边的东西是 运行ning console.log 时的样子;下面的东西是它的样子现在是。

多年来我已经习惯了这一点,但我不得不承认我并不清楚为什么我们两者都有!

我猜在 vsc 中,promise 状态仍处于待定状态,因为 console.log() 在超时完成之前被触发,您可以试试这个


const waitForTimeout = () => new Promise(resolve => setTimeout(() => resolve('OK'), 1000);

(async function() {
   const promise = await waitForTimeout();
   console.log(promise);
})(); // self fulfilling function