首页 > 编程语言 >6.Node与浏览器EventLoop的差异

6.Node与浏览器EventLoop的差异

时间:2023-03-04 20:34:13浏览次数:60  
标签:Node 回调 浏览器 NodeJS 队列 EventLoop 任务 执行

任务队列个数不同

浏览器事件环有2个事件队列

  • 宏任务队列
  • 微任务队列

NodeJS事件环有6个事件队列

  • 定时器(timers):本阶段执行已经被 setTimeout() 和 setInterval() 的回调函数
  • 待定回调(pending callbacks):执行延迟到下一个循环迭代的 I/O 回调。
  • idle, prepare:仅系统内部使用
  • 轮询(poll):检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外),其余情况 node 将在适当的时候在此阻塞。
  • 检测(check):setImmediate() 回调函数在这里执行。
  • 关闭的回调函数(close callbacks):一些关闭的回调函数,如:socket.on(‘close’, …)。

NodeJS中的EventLoop与浏览器的EventLoop之间的区别

  • 浏览器:先执行 一个 宏任务,然后执行所有微任务……循环往复
  • NodeJS:先执行一种 宏任务 在执行清空微任务 再一种 宏任务 在执行清空微任务 再一种 宏任务 在执行清空微任务 所有种类宏任务结束 … 循环往复

微任务队列不同

  • 浏览器事件环中有专门存储微任务的队列
  • NodeJS 事件环中没有专门存储微任务的队列

微任务优先级不同

  • 浏览器事件环中如果多个微任务同时满足执行条件,采用先进先出
  • NodeJS 事件环中如果多个微任务同时满足执行条件,会按照优先级执

其实nodejs与浏览器的区别,就是nodejs的 宏任务 分好几种,而这好几种又有不同的 任务队列,而不同的 任务队列 又有顺序区别,而 微任务是穿插在每一种【注意不是每一个!】宏任务 之间的

Timers 类型的宏任务队列

setTimeout()

setInterval

Check 类型的宏任务队列

setImmediate()

Close callback 类型的宏任务队列

socket.on(‘close’, () => {})

Poll 类型的宏任务队列

除了上面几种的其他所有回调

nodeJs 里面的微任务队列

process.nextTick() Promise.then()

process.nextTick()的优先级高于所有的微任务,每一次清空微任务列表的时候,都是先执行 process.nextTick()

标签:Node,回调,浏览器,NodeJS,队列,EventLoop,任务,执行
From: https://www.cnblogs.com/alwaysrun/p/17179010.html

相关文章

  • 2.JavaScript如何实现异步编程,可以详细描述EventLoop机制
    单线程和异步js的任务分为同步和异步两种,它们的处理方式也不同,同步任务是直接在主线程上排队执行,异步任务则会被放在任务队列中,若有多个任务(异步任务)则要在任务队列中排......
  • pythonUI自动化之浏览器启动参数设置
    网上的文章对小白不友好呀,都是给你一堆参数,都不教你怎么使用,直接跳过了最重要的部分,写下该文章希望对后续人有指导性作用 什么参数都不设置时的启动方式importtimef......
  • vm-集群初始化3节点搭建(node01、node02、node03)
    首先确保windows系统,对应的vmware 服务都是正常运行修改虚拟机对应的主机名字设置虚拟机的主机名,重启生效 reboot修改对应的配置hosts 配置文件,vim/etc/hosts关......
  • 项目中常用的node的文件操作
    constfs=require('fs');1、fs.createReadStream(path,[options])返回一个readStream(文件读取流,输入流)对象。(可读流)path:(string)想读取的文件路径options:(obje......
  • 【Dockerfile】nvm-git-node-centos7镜像
    #依赖centos环境FROMcentos:7#安装vim、git和nvm环境RUNyuminstall-ywget\&&mv/etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.rep......
  • SpriteKit 之 SKEmitterNode
    SKEmitterNode属性介绍何时创建粒子///产生的速度,默认0varparticleBirthRate:CGFloat///产生最大数量后停止,默认是0不停止varnumParticlesToEmit:Int粒子......
  • 火狐中关闭最后一个标签页时 不关闭浏览器
    1.在地址栏输入”about:config“并回车。2、接着会出现一个提示“这可能使质量保证失效”,点击“我了解此风险!”。3、在搜索的空白栏中输入browser.tabs.closeWindowWithL......
  • 浏览器主页被篡改
    之前为这个问题苦恼了许久,后来终于在网上找到了真正快捷的方法,分享给大家。下面以微软的edge浏览器为例右键浏览器图标(浏览器快捷方式在桌面)->属性假如浏览器在开始菜单......
  • 谷歌浏览器将本地主机重定向到 https
    当我使用Chrome调试VisualStudio项目时,浏览器会尝试重定向到与我的网址等效的https。我没有在Web项目中启用SSL,起始URL是httpURL。当我使用FireFox或I......
  • 外部浏览器中H5跳转微信小程序方法
    H5网页通过URLScheme进行跳转URLScheme的获取方法有两种1.在需要跳转的小程序的小程序管理后台中通过工具直接生成,该方法生成的URLScheme不能实时指定跳转小程序的......