setTimeout(() => {
console.log("In setTimeout");
});
setImmediate(() => {
console.log("In setImmediate");
});
输出:
如您所见,我第一次运行该模块时,首先在setTimeout的回调之前执行setImmediate的回调,但是第二次运行该脚本,则相反。
这与事件循环有关,您可以在此链接https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/上找到有关此问题的很好的文档。简而言之,setImmediate在轮询阶段之后执行,setTimeout在“计时器”阶段执行,因此执行顺序取决于在节点进程中执行的第一阶段。如果将setTimeout和setImmediate放入I / O回调(挂起的回调)中,则将首先执行setImmediate。 (请参阅下面的代码,该代码也存在于上一个链接中))
// timeout_vs_immediate.js
const fs = require('fs');
fs.readFile(__filename, () => {
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
});