首页 > 编程语言 >node的事件循环和浏览器的事件循环有什么区别?

node的事件循环和浏览器的事件循环有什么区别?

时间:2024-12-06 09:43:09浏览次数:4  
标签:node Node 浏览器 setImmediate js 循环 事件 setTimeout

Node.js 和浏览器的事件循环虽然都是基于事件驱动的架构,但它们在实现和一些细节上有所不同。主要区别如下:

1. I/O 处理:

  • 浏览器: 浏览器中的 I/O 操作主要依赖于 Web APIs(例如:fetch, XMLHttpRequest, setTimeout 等)。浏览器负责管理这些 API,并在操作完成后将相应的事件添加到事件队列中。
  • Node.js: Node.js 基于 libuv 库来处理 I/O 操作。libuv 提供了一个线程池来处理耗时的 I/O 操作,并在操作完成后将事件添加到事件队列中。 这使得 Node.js 能够高效地处理并发 I/O。

2. 事件循环的阶段:

两者都遵循类似的事件循环阶段概念,但阶段的名称和具体功能略有不同。

  • 浏览器 (HTML5 规范):

    • Task Queue (Macrotask 队列): 处理 setTimeout, setInterval, setImmediate (IE 特有), requestAnimationFrame, I/O, UI rendering 等。一个事件循环 tick 只会处理一个 macrotask。
    • Microtask Queue: 处理 Promisethencatchfinally 回调, queueMicrotask 等。在当前 macrotask 执行完毕后,会立即执行所有 microtask,直到 microtask 队列为空。 这意味着在一个事件循环 tick 中,可能会有多个 microtask 执行。
  • Node.js (libuv): Node.js 的事件循环更复杂,包含更多阶段:

    • timers: 处理 setTimeoutsetInterval 的回调。
    • pending callbacks: 处理一些系统操作的回调,例如 TCP 错误。
    • idle, prepare: 仅供 libuv 内部使用。
    • poll: 检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有回调都在此阶段执行,除了 close callbacks, timers 和 setImmediate)。
    • check: 执行 setImmediate() 的回调。
    • close callbacks: 处理一些关闭的回调,例如 socket.on('close', ...)

3. setImmediate() vs. setTimeout(..., 0):

  • 浏览器: setImmediate 不是标准的 Web API,只有 IE 支持。setTimeout(..., 0) 的实际延迟时间通常受浏览器最小延迟时间的限制 (通常是 4ms)。
  • Node.js: setImmediatesetTimeout(..., 0) 都用于将回调函数放到下一个事件循环 tick 中执行。但在 Node.js 中,setImmediate 的回调通常在 poll 阶段之后、check 阶段执行,而 setTimeout(..., 0) 的回调在 timers 阶段执行。 setImmediate 通常比 setTimeout(..., 0) 执行得更早,尤其是在 I/O 操作较多的情况下。

4. 环境:

  • 浏览器: 运行在浏览器环境中,提供 DOM API,与用户界面交互。
  • Node.js: 运行在服务器端环境,提供文件系统、网络等服务器端 API。

总结:

尽管两者都使用事件循环来处理异步操作,但由于运行环境和底层实现的不同,它们在 I/O 处理、事件循环阶段、定时器行为等方面存在差异。理解这些差异对于编写高效的浏览器和 Node.js 应用程序至关重要。

标签:node,Node,浏览器,setImmediate,js,循环,事件,setTimeout
From: https://www.cnblogs.com/ai888/p/18589955

相关文章

  • js的循环结构有哪些?
    JavaScript提供了多种循环结构,用于重复执行代码块。以下是几种常见的循环类型:for循环:这是最常用的循环结构,它允许你根据计数器或条件重复执行代码块。for(leti=0;i<10;i++){console.log(i);//输出0到9}//for循环的三个部分://1.初始化:leti......
  • 11C++循环结构-for循环(1)——教学
    一、for语句(第27课老狼老狼几点钟)参考1引出问题:当需要重复执行某一语句时,使用for语句。for语句最常用的格式为:for(循环变量赋初值;循环条件;循环变量增值)语句;注:“语句;”就是循环体,可以是一个简单的语句,也可以是一个用“{}”括起来的复合语句。它的执行过程如图示:编......
  • 【Java】Switch语句、循环语句(for、while、do...while)
    Switch语句:针对某个表达式的值进行判断,从而决定执行哪一段代码语法格式:switch(表达式){      case目标值1:              执行语句1                      break;       case目标值2:   ......
  • 【ubuntu】使用二进制安装包安装node和npm并配置
    一、官网https://nodejs.org/zh-cn 二、安装方法1、下载安装包 2、解压安装包到指定目录tarxfnode-v14.21.0-linux-x64.tar.xz-C~/tools/&&cd~/tools 3、配置环境变量#nodeexportNODE_HOME=$HOME/tools/node-v14.21.0-linux-x64exportPATH=$NODE_HO......
  • Nuxt.js 应用中的 beforeResponse 事件钩子
    title:Nuxt.js应用中的beforeResponse事件钩子date:2024/12/5updated:2024/12/5author:cmdragonexcerpt:在Web开发中,处理响应是一个至关重要的环节。Nuxt.js提供的beforeResponse钩子允许开发者在发送响应之前对结果进行修改或处理。这一机制非常有助于确保返......
  • 【漏洞分析】Vestra DAO 攻击事件:这个质押项目它取款不核销呀
    背景信息攻击交易:https://app.blocksec.com/explorer/tx/eth/0x9a1d02a7cb9fef11fcec2727b1f9e0b01bc6bcf5542f5b656c84d6400a1b4604漏洞合约:https://etherscan.io/address/0x8a30d684b1d3f8f36b36887a3deca0ef2a36a8e3#codeLockedStaking合约提供质押功能,用户调用stake函数......
  • node.js毕设基于微信小程序的同城快运系统小程序端程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于同城快运系统的研究,现有研究主要以传统的物流管理系统为主,专门针对基于微信小程序的同城快运系统的研究较少。在国内外,物流行业发展迅速,同城快递的......
  • node.js毕设勤工助学管理系统 程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于勤工助学管理系统的研究,现有研究主要集中在高校管理系统的一般性研究上,专门针对勤工助学管理系统的研究较少。在国内外,高校管理系统的发展已经较为......
  • 09-循环语句
    09-循环语句有些事必须一直做。【比如】日复一日的学习。写每天3W行代码,找一个好工作。#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ intline=0; //输入变量 while(line<30000) { printf("写代码:%d\n",line); line++; } if(......
  • VUE-UNI事件转发监听
    VUE以及uni-app如果在项目中事件转发以及监听事件在业务页面a.vue里面,调用了一个第三方接口,这个接口的回调是在项目的app.vue的onShow里面给的回调,那我现在在a.vue里面怎么处理。这个时候就需要做事件的转发,在a页面做事件的监听方法:store下边新建一个jseventBus.jsi......