NodeJs事件环-面试题

本文详细探讨了NodeJS中setTimeout和setImmediate的执行机制,解释了为何在不同场景下它们的执行顺序可能不同,特别是涉及到I/O操作如文件读取时的影响。通过示例代码展示了在读取文件后如何影响异步任务的调度,从而帮助理解NodeJS的事件循环和队列处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Example-01

setTimeout(function () {
    console.log("setTimeout");
});
setImmediate(function () {
    console.log("setImmediate");
});

执行结果:

                               或                    

执行结果:setTimeout  setImmediate  /  setImmediate  setTimeout
注意点:在NodeJs中指定的延迟时间是有一定的误差的,所以导致了输出结果随机的问题;

解析:
(setTimeout会被放在timers队列中,setImmediate会被放在check队列中)

情况一:NodeJS中首先会去到timers队列执行所有任务,如果setTimeout函数中的延迟时间推迟了,那么此时timers队列中是没有满足条件的异步任务的,那么js线程就会检查有没有微任务,如果没有,继续来到poll队列,poll队列中没有异步任务,再去检查有没有微任务,如果没有继续往下执行,来到check队列,就会执行setImmediate任务,接着,又去检查有没有微任务,如果没有,再去检查timers队列,进行刚刚的重复操作,这种情况下执行结果就是setImmediate  setTimeout;

情况二:如果setTimeout函数中的延迟时间没有推迟或者是提前了,那么此时timers队列中是有满足条件的异步任务的,那么js线程直接执行当前任务,接着就会检查有没有微任务,如果没有,继续来到poll队列,poll队列中没有异步任务,再去检查有没有微任务,如果没有继续往下执行,来到check队列,就会执行setImmediate任务,接着,又去检查有没有微任务,如果没有,再去检查timers队列,进行刚刚的重复操作,这种情况下执行结果就是setTimeout  setImmediate ;

Example-02 

const path = require("path");
const fs = require("fs");

let filePath = path.join(__dirname,"02-a.js");
fs.readFile(filePath,function () {
    setTimeout(function () {
        console.log("setTimeout");
    });
    setImmediate(function () {
        console.log("setImmediate");
    });
});

执行结果:

解析:因为读取文件操作属于I/O操作,所以readFile这个异步任务会放在poll队列中,首先来到timers队列,再来到poll队列,执行readFile代码,把setTimeout异步任务会放在timers队列中,把setImmediate异步任务会放在check队列中,此时poll队列执行完毕,会去检查有没有微任务,如果没有,会切换到check队列中,所以会先执行setImmediate异步任务,接下来会切换到timers队列,执行setTimeout异步任务,所以,无论setImmediate写在前面还是后面,都会先执行setImmediate;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值