function compareFunc () {
console.log(1);
setTimeout(function () {
console.log(2);
}, 1);
process.nextTick(function () {
console.log(3);
});
setTimeout(function () {
console.log(4);
}, 0);
}
compareFunc();
// 执行结果:
//1
//3
//2
//4
这个图该怎么理解。根据这个图,timers 不是在dile观察者前面吗?
nextTick
属于microTask
, 而setTimeout
属于macroTask
. 一个macroTask
执行完后会插入多个microTask
.这里的
macroTask
不只是setTimeout
, 还有主线程的运行脚本. 比如你的compareFunc
函数, 运行的时候声明两个异步任务.此时
nextTick
被插入主线程脚本执行之后, 在事件循环timers
阶段之前, 而setTimeout
则是timers
阶段执行.所以这里优先级是
nextTick
高于setTimeout
.刚好写了一篇 Node.js的事件循环机制的文章, 有兴趣可以读一读. 有阅读疑问都可以提出来.
理解事件循环机制