欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于event loop

程序员文章站 2022-04-16 08:22:16
之前写了篇文章 JS运行机制,里面对event loop简单的说明,面试时又遇到了关于该知识点的题目(主要是process.nextTick和setImmediate的执行顺序不太知道,查了之后才知道是关于Node JS的event loop)看了阮一峰老师的博客,又有了更深入的理解: 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.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参考 

参考;阮一峰老师博客