首页 > 解决方案 > SetTimeout 和 SetImmediate 与 console.log

问题描述

谁能解释为什么我在两种类型的输出下得到这个,用于在 setTimeout 和 setImmediate 之间添加和删除 console.log。

为什么我在执行示例 1 时得到不同的输出以及为什么我在示例 2 中得到相同的输出。请告诉我 setTimeout 和 setImmediate 之间的区别

示例 1:

setTimeout(function(){
        console.log("inside timeout")
});

setImmediate(function(){
        console.log("inside immediate")
});

输出:

inside immediate
inside timeout

示例 2:

console.log(1)

setTimeout(function(){
        console.log("inside timeout")
});
console.log(2)
setImmediate(function(){
        console.log("inside immediate")
});
console.log(3)

输出:

1
2
3
inside timeout
inside immediate

标签: javascriptnode.js

解决方案


来说说中的情况nodeJs。实际上下面代码的顺序是不能保证的。

 setTimeout(function(){
            console.log("inside timeout")
    });

    setImmediate(function(){
            console.log("inside immediate")
    });

如果你多次运行它,你会发现,它很有可能是

inside immediate
inside timeout, 

但有时它是相反的。你的第二个演示是一样的。

在 nodeJs 中有一件事调用event loop,对于异步函数,将其 event loop转发到libuv然后转发到操作系统。例如。当 setTimeout 的时间到时,回调函数被设置到队列中,在同步线程完成后调用。对于不同的异步任务有四个不同的队列,setTimeout's队列在队列之前运行。setImmediate's但是setTimeout的cut down return依赖于CPU的时间片,甚至setTimeout(0),所以不稳定。


推荐阅读