【问题标题】:Why does setTimeout not trigger after specified time为什么 setTimeout 在指定时间后不触发
【发布时间】:2019-04-25 19:54:02
【问题描述】:

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

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

节点测试.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 毫秒后中断。但它继续旋转,输出为“继续旋转”

【问题讨论】:

  • 你的循环正在阻止其他任何东西的执行。

标签: javascript node.js


【解决方案1】:

当您调用setTimeout 或为此执行任何阻塞操作时,它实际上已添加到事件表中并且不会立即执行。

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

为了更好地理解这一点,请查看以下示例:

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

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

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

您可能想查看this,它会让您更好地了解幕后发生的事情。

【讨论】:

  • 来自 Hamza 下面的帖子和您的评论是的,似乎是这样。我想真正的原因是 Javascript 是事件驱动的并且是单线程的。所以如果线程总是很忙(执行while循环),它永远没有机会检查事件超时,因此永远不会触发回调?
【解决方案2】:

While(1) 是一个无限的 while 循环。我觉得是这个原因

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多