NodeJS-EventLoop-面试题
首先我肯定不会一开始就给出该面试题的答案,我将会以一个小案例代码来引出该面试题,小案例代码如下:
setTimeout(function () {
console.log("setTimeout");
});
setImmediate(function () {
console.log("setImmediate");
});
我的问题是如上的代码输出的结果是什么,是先输出 setImmediate
还是先输出 setTimeout
,首先要明确一点 setTimeout 我没有设置延迟时间,没有设置默认是 0
相当于如下代码:
setTimeout(function () {
console.log("setTimeout");
}, 0);
setImmediate(function () {
console.log("setImmediate");
});
我把如上的代码运行两次输出结果分别如下:
发现了一个问题就是两次的输出结果不一致,那么在这里就有一个注意点,如上代码输出的结果是随机的,在 NodeJS 中指定的延迟时间是有一定的误差的,所以导致了输出结果随机的问题,分析示例图如下:
如上还不是要介绍的一道面试题,面试题如下所示:
const path = require("path");
const fs = require("fs");
fs.readFile(path.join(__dirname, "06.js"), function () {
setTimeout(function () {
console.log("setTimeout");
}, 0);
setImmediate(function () {
console.log("setImmediate");
});
});
现在我想知道如上代码的执行结果输出的是什么,多次运行输出的结果又是什么,其实永远都是 setImmediate 在前,setTimeout 在后:
至于为什么,分析示例图如下:
因为执行与 I/O 相关的回调会放到 poll 队列当中,poll 队列执行完毕就会执行 check 队列,所以说永远都是先执行 check 在执行 timers,就造成了永远是先输出 setImmediate,在输出 setTimeout 😁