为什么setTimeout无法按预期工作?

时间:2019-07-17 06:01:09

标签: javascript node.js

请参见下面的代码。

SetTimeout应该在100ms时间后执行seconf函数。但是第一个阻止了第二个,这是意外的。 Settimeout以异步方式工作。

function funcOne(){
    console.log("FuncOne invoked")
    let i=0;
    while(i<10000000000){i++}
    console.log("Hello world")

}
function funcTwo(){
    console.log("FuncTwo invoked");
}

setTimeout(funcOne,0)   
setTimeout(funcTwo,100)

输出应为

调用FuncOne

调用了FuncTwo

Hello World

但是实际输出是

调用FuncOne

HelloWorld

调用了FuncTwo。

2 个答案:

答案 0 :(得分:3)

JavaScript不能在单独的线程中运行*,因此所有代码都在一个线程中运行。任何“异步”就是轮流运行的各种代码。 Javascript引擎永远不会中断一个功能,因为另一个功能计划在给定的时间运行,这是您需要照顾好自己的事情。

因此,在您的情况下,funcOne被执行(完全),即使花费了100毫秒以上的时间,也会检查超时,并且由于funcTwo将要运行,因此它会被执行(完全)。

*好吧,也许和工人在一起,但这并不漂亮。

答案 1 :(得分:0)

在您的while循环结束之前,不会调用第二个setTimeout

所以你得到了这个订单

第一次超时 FuncOne被调用 While循环结束 你好世界

在100毫秒funcTwo调用后,调用了第二次超时