node 版本:v12.9.1
为什么加一个 10 ms 的计时器,会导致100毫秒计时器提前执行呢?我的理解是:
- event-loop 在第一次进入 time 阶段监测10秒,执行了 10ms 定时器,
- 然后应该直接进入 poll 阶段,执行这个阶段的 fs 文件读取和回调函数内的代码,因为读取文件和回调函数内的代码造成延迟,导致 100ms 计时器实际执行的时间要大于 100ms
可2个定时器的代码,结果输出的和我预想的又不一样,望大神指点。代码如下
代码index.js
const fs = require("fs");
const someAsyncOperation = cb => {
fs.readFile("./abc.txt", cb);
};
function fib(num) {
if (num === 0) return 0;
if (num === 1) return 1;
return fib(num - 2) + fib(num - 1);
}
const startTime = Date.now();
setTimeout(() => {
console.log("setTimeout 100 time %s ms", Date.now() - startTime);
}, 100);
setTimeout(() => {
console.log("setTimeout 10 time %s ms", Date.now() - startTime);
}, 10);
someAsyncOperation(() => {
console.log("someAsyncOperation time %s ms", Date.now() - startTime);
const result = fib(40);
console.log("fib time %s ms", Date.now() - startTime);
});
直接运行,控制台输出如下:
setTimeout 10 time 12 ms
setTimeout 100 time 101 ms
someAsyncOperation time 114 ms
fib time 1354 ms
注释 10 毫秒计时器的代码,控制台输出如下:
someAsyncOperation time 98 ms
fib time 1338 ms
setTimeout 100 time 1341 ms