首页 > 解决方案 > 如果代码较大且调用堆栈不为空,事件循环如何在 2 秒内准确执行代码?

问题描述

许多解释都谈到调用堆栈是空的,但我不明白,如果我们将计时器设置为 2 秒并以异步方式执行代码,如果我有一个运行时间为 10 秒的代码并调用 -栈不为空,回调队列中的回调函数会等待11秒执行吗?

标签: javascriptnode.jsevent-loopsingle-threaded

解决方案


...回调队列中的回调函数会等待 11 秒执行吗?

不一定是 11 秒,不;它将在 10 秒同步代码完成后不久运行。如果定时器的长度短于同步代码持续时间,则它的长度无关紧要。此页面中有关 Node.js 事件循环如何工作的更多详细信息。

例如,使用以下代码:

function elapsed(start) {
    const elapsed = Date.now() - start;
    return `${(elapsed / 1000).toFixed(4)}s`;
}
const startTimer = Date.now();
console.log(`Starting timer`);
setTimeout(() => {
    console.log(`Timer fired after ${elapsed(startTimer)}`);
}, 2000);
const finish = Date.now() + 10000;
const startBusyWait = Date.now();
console.log(`Starting to wait`);
while (Date.now() < finish) {
    // Busy-wait -- DON'T DO THIS
}
console.log(`Done busy-waiting after ${elapsed(startBusyWait)}`);

你会看到类似的东西:

启动计时器
开始等待
10.0000 秒后完成忙等待
计时器在 10.0050 秒后触发

推荐阅读