为什么setTimeout在指定时间后没有触发

时间:2019-04-25 19:54:02

标签: javascript node.js

我正在Viusal Studio代码中运行一个非常基本的javascript代码。但是我没有看到回调函数被触发。

我试图了解setTimeout()在javascript中的工作方式。我正在Visual Studio代码中运行以下代码(在名为test.js的文件中),如下所示:

  
    

节点test.js

  
'use strict'

let timerexpired = false;
setTimeout( function() {console.log(`setting timerexpired to true...`);
                        timerexpired = true;
                        }, 
                        5000);

while(1) {
    console.log(`timerexpired = `, timerexpired);

    if (timerexpired) {
        console.log(`timer expired.  Resume execution`);
        break;
    } else {
        console.log(`keep on spinning`);
    }

}

预计循环将在5000毫秒后断开。但是它一直在旋转,输出为“继续旋转”

2 个答案:

答案 0 :(得分:2)

调用setTimeout或对此事进行任何阻止操作时,实际上已将其添加到事件表中,而不会立即执行。

只有在调用堆栈为空后,事件循环才检查事件表以查看是否有任何等待,并将其移至调用堆栈。

要更好地理解这一点,请检查以下示例:

setTimeout(() => console.log('first'), 0)
console.log('second')

您可能认为first将在second之前被记录,但实际上second将首先被记录。

在您的示例中,调用堆栈永远不会为空,因此setTimeout不会真正按预期工作。

您可能想检查this,它将使您对幕后发生的事情有更好的了解。

答案 1 :(得分:0)

虽然(1)是一个无限的while循环。我认为这是原因