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");
});

我把如上的代码运行两次输出结果分别如下:

image-20210824230232952

image-20210824230355668

发现了一个问题就是两次的输出结果不一致,那么在这里就有一个注意点,如上代码输出的结果是随机的,在 NodeJS 中指定的延迟时间是有一定的误差的,所以导致了输出结果随机的问题,分析示例图如下:

image-20210824230612394

如上还不是要介绍的一道面试题,面试题如下所示:

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 在后:

image-20210824231205942

至于为什么,分析示例图如下:

image-20210824231151000

因为执行与 I/O 相关的回调会放到 poll 队列当中,poll 队列执行完毕就会执行 check 队列,所以说永远都是先执行 check 在执行 timers,就造成了永远是先输出 setImmediate,在输出 setTimeout 😁

posted @ 2021-08-24 23:17  BNTang  阅读(74)  评论(0编辑  收藏  举报