之前写了篇文章 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

最新文章

  1. [Nginx] - 负载均衡配置
  2. javascript 面向对象整理
  3. javaScript创建无边框iframe兼容ie
  4. java 判断字符串是否为乱码
  5. android 几种发送短信的方法
  6. 转: 向tabControl中添加一个Form(C#)
  7. C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0
  8. SQL 2005 中查询或执行另外的数据库操作的方法
  9. OMCS ——卓尔不群的网络语音视频框架
  10. Swift开发
  11. ajax请求获取实时数据
  12. JDBC的java驱动安装
  13. caffe-ssd需要安装opencv
  14. 虚拟机centos7 基础模板制作
  15. fiddler软件测试——Fiddler抓取https设置详解(图文)
  16. NaviSoft31.源码开发完成
  17. poj1873(枚举+凸包)
  18. mybatis打印sql日志配置
  19. Hibernate分页查询的两个方法
  20. ArrayList,Vector,LinkedList

热门文章

  1. Django自定义过滤器
  2. tinkphp3.2.3 关于事务处理。
  3. Keepalived & Lvs集群搭建实验
  4. Quartz使用(5) - Quartz的Job存储及集群部署
  5. git 摘要
  6. 调用webservice
  7. 零基础逆向工程36_Win32_10_互斥体_互斥体与临界区的区别
  8. ztree树形图自定义图标在jeecg框架中不显示
  9. iDempiere 使用指南 采购入库流程
  10. lunix重启service network restart错误Job for network.service failed. See 'system 或Failed to start LSB: Bring