NodeJS事件循环面试题
在NodeJS中指定的延迟时间是有一定的误差的,所以导致了输出结果随机的问题
setTimeout(function () { console.log("setTimeout"); }, 0); setImmediate(function () { console.log("setImmediate"); });
而在poll队列中输出结果是固定的:
- 会先将readFile放在poll队列。同步代码执行完毕——切换到timers,timers为空——切换到poll,poll中任务未满足条件——检查到check为空,则不切换到check,而切换到timers,timers仍然为空——poll发生阻塞。当poll中任务满足条件,执行readFile的回调——将setTimeout放在timers中,setImmediate放在check中,当readFile执行完毕,则检查check,执行check中任务——执行timers中任务
const path = require("path"); const fs = require("fs"); fs.readFile(path.join(__dirname, "04.js"), function () { setTimeout(function () { console.log("setTimeout"); }, 0); setImmediate(function () { console.log("setImmediate"); }); }); // setImmediate setTimeout