注册长延迟事件后JS执行机制疑问:程序会等待还是终止?
问题解答
核心疑问
如果注册了setTimeout这种延迟时间极长(比如五、六分钟)的事件,当调用栈和回调队列里的所有任务都执行完、处于空状态时,程序会等着这个事件触发,还是直接终止?
示例代码
console.log("Starting.."); setTimeout((a, b) => { console.log("2 sec Timer"); }, 5000000); setImmediate(() => { console.log("Immediate Timer"); }); setTimeout(() => { console.log("0 sec Timer"); }, 0); console.log("Ending..");
答案
程序不会等这个超长延迟的setTimeout触发,会直接终止。
拿示例里的Node.js环境来说(因为用到了setImmediate这个Node专属API),事件循环的逻辑是:当调用栈和回调队列都清空后,会检查是否还有必须维持运行的异步资源。这个5000000ms的定时器虽然挂着,但它属于“非必要等待”的资源——当没有其他待处理任务时,事件循环不会傻等这么久,直接就退出了。
具体到示例代码的执行流程:
- 先同步执行
console.log("Starting..")和console.log("Ending.."),先输出这两行; - 接着处理
setTimeout(fn, 0)的回调(实际会在事件循环下一轮执行,延迟远小于1毫秒),输出0 sec Timer; - 然后处理
setImmediate的回调,输出Immediate Timer; - 这时候调用栈和回调队列都空了,事件循环一看没别的事儿要干,直接终止程序,根本不会等那5000000ms的定时器触发。
内容的提问来源于stack exchange,提问作者Mayank
相关产品推荐
相关产品推荐

