对代码为什么在文件读取回调之前调用setImmediate?
function someAsyncOperation() {
console.log("inside someAsyncOperation");
var startCallback = Date.now();
// do something that will take 10ms...
while (Date.now() - startCallback <= 100) {
; // do nothing
}
}
someAsyncOperation();
var timeoutScheduled = Date.now();
setImmediate(function() {
var delay = Date.now() - timeoutScheduled;
console.log(delay + "ms have passed since I was scheduled");
});
someAsyncOperation();
fs.readFile("./noor.txt",function(err,data){
var delay = Date.now() - timeoutScheduled;
console.log(delay + "file read");
});
这些线看起来我才知道,setImmediate回调是在事件循环的任何I/O操作后结束运行。但在我的情况下,setImmediate回调在文件读取操作返回之前调用。请解释为什么会发生这种情况,或者setImmediate回调执行的逻辑是什么。
正如我所提到的,setImmediate计划的回调应该在事件循环结束时运行,这意味着所有事情都必须在setImmediate回调被触发之前完成,这就是nodejs官方文档告诉的。因此,无论特定事件循环中的任何代码是否被占用,都无关紧要。 – nurulnabi
'setImmediate()'回调函数在事件循环的下一个tick的*开头执行(在针对事件循环的当前tick执行I/O回调之后)。但是,正如我所说的那样,打开文件,读取整个文件,关闭文件等所有系统调用都将立即*完成,以至于它们的回调将在当前刻度结束时执行。事实上,我认为这可能是不可能的,因为异步本质(每个操作都不能并行执行,所以它们是以串行方式执行的)。 – mscdex