之前写了篇文章 JS运行机制,里面对event loop简单的说明,面试时又遇到了关于该知识点的题目(主要是process.nextTick和setImmediate的执行顺序不太知道,查了之后才知道是关于Node JS的event loop)看了阮一峰老师的博客,又有了更深入的理解:

JS中的任务分同步任务和异步任务:

所有同步任务都在主线程中执行,形成一个执行栈

主线程之外还有一个任务队列,用于存放异步任务,执行栈中的同步任务执行完毕,系统就会读取任务队列中的异步任务,将其放到执行栈中;

上述过程不断循环,此过程就是Event Loop

NodeJS的Event Loop

Node.js也是单线程的Event Loop,但是它的运行机制不同于浏览器环境.

除了setTimeout和setInterval这两个方法,Node.js还提供了另外两个与"任务队列"有关的方法:process.nextTicksetImmediate

process.nextTick方法可以在当前"执行栈"的尾部----下一次Event Loop(主线程读取"任务队列")之前----触发回调函数。

setImmediate方法则是在当前"任务队列"的尾部添加事件。(摘自阮老师的博客)

概括来说,执行顺序:process.nextTick > setTimeout(setInterval) > setImmediate

process.nextTick(()=>{
    console.log('nextTick');
})
Promise.resolve().then(()=>{console.log('promise1')}).then(()=>{
    console.log('promise2');
});
setImmediate(()=>{console.log('setImmediate1')})
console.log('end');

执行结果:
end
nextTick
promise1
promise2
setImmediate1

//说明:先执行同步任务--输出end,process.nextTick会在执行栈尾部触发,所以接下来会输出nextTick
//setImmediate会在任务队列的尾部,因此顺序是promise1 promise2 setImmediate1

  

NodeJS event loop参考 https://blog.csdn.net/hkh_1012/article/details/53453138

参考;阮一峰老师博客http://www.ruanyifeng.com/blog/2014/10/event-loop.html