Node.js——回调函数及事件处理机制

2023-11-14

回调函数

定义

什么是回调函数呢?

通俗的讲,将一个函数A作为参数传递给函数B,在函数B内对函数A进行调用,函数A就是回调函数。

Node.js 异步编程的直接体现就是回调。

回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。

理解

(1)异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。

例1:

function main(info,callback){
	console.log('回家发短信')
	callback(info)   //调用回调函数
}
function sendMsg(msg){
	console.log(msg)
}
main('我回家了',sendMsg)   //调用主函数

//回家发短信
//我回家了
//执行结果还是同步的

(2)在非阻塞的I/O操作中,主程序的执行和回调函数不是同步,实现异步。

例2:

const fs = require('fs');
//异步读取文件 的内容(回调函数)
fs.readFile('demo.txt',function (err,data){
    if(err){
        console.log(err);    //输出错误信息
    }
    console.log(data.toString());    //输出文件内容
})

//3、主程序流程结束
console.log("node程序已经执行结束")

//node程序已经执行结束
//文件内容

我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

事件处理机制

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。

1、首先,会形成一个事件处理的队列,用于将所有的事件请求放到队列中(例如读写文件等操作请求);

2、然后启动事件循环机制,对事件队列里面的事件进行不断的轮询检查,如果有需要处理的事件,就对每个事件依次进行处理;

3、进行事件监听

(1)引入事件模块:events
(2)创建事件监听对象:EventEmitter
(3)注册监听:监听不同类型的事件(使用on函数)

4、对事件进行触发,使用emit函数。

在这里插入图片描述

Node.js 使用事件驱动模型,当web server(web服务器)接收到请求,就把请求连接关闭,然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户,服务器不断接收用户的请求,任务队列不断给用户响应结果,这个请求响应的过程实际上还是一个异步的过程。

由于nodejs是单线程运行的,所以nodejs需要借助事件轮询,不断去查询事件队列中的事件消息,然后执行该事件对应的回调函数。

这个模型非常高效可扩展性非常强,因为 web server 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO

补充

事件监听的各种方法:

  • addListener(event,listener) :事件监听函数

  • on(event, listener) :对指定对象绑定事件处理函数(addListener方法的别名)

  • once(event, listener) :对指定对象指定只执行一次的事件处理函数

  • removeListener(event, listener) :删除事件

  • setMaxListeners(n) :指定对象处理函数的最大数量,n为正数值,代表最大的可指定事件处理函数的数量

  • listeners(event) :获取指定对象的所有事件处理函数

  • emit(event, [arg1], [arg2], [...]) :手动触发指定事件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js——回调函数及事件处理机制 的相关文章

  • 从 Nodejs 提供二进制/缓冲区/base64 数据

    我在从节点提供二进制数据时遇到问题 我开发了一个名为的节点模块节点说话它执行 TTS 文本到语音 并返回 Base64 编码的音频文件 到目前为止 我这样做是为了转换base64到缓冲区 二进制文件 然后提供它 var src Base64
  • 如何使用 cradle (CouchDB) 将参数传递给视图

    Using cradle https github com cloudhead cradle 如何将参数传递给 CouchDB 中的视图 Update 假设我想返回与其他属性匹配的文档 key 默认 document format key
  • 使用 MongoDB 和 Nodejs 插入和查询日期

    我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录 我将日期添加到抓取脚本中的 json 对象 如下所示 jsonObj last updated new Date 该对象被插入到 mongodb 中 我可以看到如下 la
  • 在 Mac OS Sierra 上使用 brew 安装节点失败

    我正在尝试在 macOS Sierra 上使用自制程序安装节点 我跑 brew install node 看似成功安装后 我在尝试运行时得到以下信息node dyld Library not loaded usr local opt icu
  • 为什么有时 npm install 在 mac 上不起作用?

    我在运行命令时创建了nodejs项目npm 安装它因一些错误而失败 同一个项目正在进行中ubuntu系统但是当我克隆这个代码时mac系统并尝试运行 npm install 它失败并出现一些错误 我认为 scrypt 模块有问题 但我不知道确
  • 如何在node.js中同步读取文件或Stream?

    请不要讲授关于我应该如何异步完成所有事情的讲座 有时我想以简单明显的方式做事 这样我就可以继续其他工作 由于某种原因 以下代码不起作用 它与我在 a 上找到的代码匹配最近的问题 https stackoverflow com questio
  • pine、node.js (express) 和 Access-Control-Allow-Origin

    我正在本地电脑上开发一个应用程序 前端应该使用 spinjs 构建 后端 api 使用 node js 构建 Spine 运行在端口 9294 上 node js 运行在端口 3000 上 在 Spine 中 我在模型中添加了以下内容 ur
  • 控制台未打开时无法加载资源:net::ERR_EMPTY_RESPONSE

    我正进入 状态 Failed to load resource net ERR EMPTY RESPONSE 如果控制台未打开 我的 api 调用会出错 然而如果控制台打开 则 api 调用工作正常 前端使用 Angular2 后端使用 N
  • nodejs knox 放入 s3 结果是 403

    我尝试在 nodejs 项目中使用 knox 上传到 Amazon s3 存储桶 但无法解决 403 错误 我已确保密钥 秘密和存储桶已正确设置 我真的需要那些有更多经验的人的帮助 我的节点代码如下 var upload test func
  • 通过在 body、mongoose/mongodb 中提供文档来更新多个文档

    我需要通过在正文中提供一些文档来更新它们 我无法查询它们 必须提供它们 Example var persons id 1 name Joe active false id 2 name Jane active false 该数据在正文中提供
  • 调用 Mongoose 插件内模式的静态方法

    我写了一个插件 可以执行以下操作 module exports function schema options schema statics customFunction function criteria Code 这是我的架构 var
  • 通过套接字的身份验证方法

    我正在尝试通过套接字进行身份验证sailsjs and passport 挑战似乎在于套接字连接没有会话 并且 sailsjs 模拟请求对象 导致它没有 Passport 中间件设置 这导致nodejs抛出一个错误 说req对象没有调用的方
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为
  • 使用edge.js .Net C# 模块是否可以调用进程的node.js 部分,即进行反向调用?

    您可以看到从 Node js gt C 的互操作模型 here http tjanczuk github io edge 7 我想知道的是 C 代码可以在返回之前从 C 调用进程的 Node js 部分中的方法吗 想象一下 如果你接到一个电
  • 生成源映射时出错 - grunt 和 sass 配置

    我正在尝试将 sass 与 grunt 一起使用 我已经在我的路径中安装了 ruby sass 和 grunt 版本是 节点 0 10 20npm 11 3 1grunt cli 0 1 13咕噜声 0 4 5萨斯 3 4 4 我的包 js
  • EJS在JS onload函数中访问express变量

    我知道你可以像这样获取 ejs 文件中变量的值 h1 h1 如果我要在同一个 ejs 页面的 onload javascript 函数中使用相同的标题变量 我将如何使用它 例如 这个函数产生一个控制台错误说 未捕获的语法错误 意外的标识符
  • 无法在渲染器进程中使用 Node.js API

    无法在 Electron 中使用任何与 Electron 或节点相关的操作 未定义获取错误过程 我检查了他们指导添加节点支持的各个地方 但这已经完成了 所以卡在这里 我的主要应用程序代码是 const electron require el
  • 运行“gulp”命令时出现“错误 [ERR_REQUIRE_ESM]”

    我是新来的Gulp并尝试自动化一些任务 这是我的环境设置 npm version 8 1 0 node version 17 0 1 gulp CLI version 2 3 0 and gulp version 4 0 2 这是我的gul
  • 如何修复nodejs Express服务器中的“MulterError:意外字段”?

    我正在设置一个服务器来从客户端上传 zip 文件 服务器运行express和multer来执行此操作 上传文件时 服务器抛出 MulterError 意外字段 错误 我无法弄清楚是什么导致了它 我尝试过使用 png 图像 效果很好 但对于
  • NodeJS:如何获取服务器的端口?

    您经常会看到 Node 的示例 hello world 代码 它创建一个 Http Server 开始侦听端口 然后执行以下操作 console log Server is listening on port 8000 但理想情况下你会想要

随机推荐

  • 旧电脑 存储服务器 系统,爷爷级PC,用白菜价内存搭建内存硬盘操作系统,老系统飞起来。...

    认识众多玩家高手 拆客 DIY爱好者 查阅更多资源 一起学习技术知识 您需要 登录 才可以下载或查看 没有帐号 立即注册 x 爷爷级PC 用白菜价内存搭建内存硬盘操作系统 老系统飞起来 系统配置 内存硬盘1 png 55 33 KB 下载次
  • nodejs:webstrom调试及使用nodemon

    参考 webstrom调试及使用nodemon 提示 如果项目有nodemon json 参数类似上图 运行时可能会提示 ts node不是内部或外部命令 也不是可运行的程序 这时候需要 npm i g ts node
  • 错误隐藏学习手记(二)

    错误隐藏技术是在H 264在解码端后端的一种技术 用于恢复某一丢失帧或者宏块 一般来说每个宏块是16 16 Step1 我们怎么知道是哪一块宏块丢失了呢 这就和视频编解码H 264有些关系了 JM86中丢失块的确定取决于编码端灵活宏块重排模
  • 巴比特

    摘要 近日 据路透社报道 三位知情人士称 腾讯控股正在与脸书母公司Meta Platforms Inc Nasdaq META 就在中国销售Meta Quest系列虚拟现实头显进行谈判 路透社援引消息人士称 腾讯与Meta之间的谈判从去年开
  • 规范国内省份名称【Java】

    规范省份名称 param ipAddr 要规范的省份名称 return String public static String addressJiaoyan String ipAddr 4个直辖市 String zxs 北京 天津 上海 重
  • 华为OD题目: 查找充电设备组合

    查找充电设备组合 题目描述 某个充电站 可提供 n 个充电设备 每个充电设备均有对应的输出功率 任意个充电设备组合的输出功率总和 均构成功率集合 P 的 1 个元素 功率集合 P 的最优元素 表示最接近充电站最大输出功率 p max 的元素
  • Redis 主从配置

    环境说明 Docker Ubuntu CentOS Redis v4 0 10 redis conf redis conf是Redis的核心配置文件 默认docker运行的redis是不存在配置文件的 这里可以先从官网下载 wget htt
  • 人工智能结构图

    人工智能结构图
  • PNP的学习-EPNP

    EPNP主要是利用已知的3d点 通过PCA选择4个控制点 建立新的局部坐标系 从而将3d坐标用新的控制点表示出来 然后 利用相机投影模型和2d点 转换到相机坐标系中 再在相机坐标系中建立和世界坐标系同样关系 每个点在相机坐标系和世界坐标系下
  • Composer 杂记

    帐号管理 config composer auth json Composer install 文件下载失败 重试好几次都失败 删除掉composer lock文件 重新 composer install 成功 使用国内的源 compose
  • [代码调试]SPHP代码调试误入的坑

    SPHP论文下载链接 今天在找SPHP论文的代码时 发现谷歌上有一位兄弟上传了 说是作者上传的源码 以为很快就可以将论文中的结果复现出来 却没想到折腾了一晚上毫无进展 下面我把我的错误经验分享给大家 SPHP代码下载链接 当我们下载完这个代
  • 编程实战(3)——python绘制极坐标雷达图

    编程实战 3 python绘制极坐标雷达图 文章目录 编程实战 3 python绘制极坐标雷达图 综述 绘图代码和解析 绘制一张多主体雷达图 预处理 封闭雷达图 绘制图像 绘制多张单主体雷达图 建立子图 循环遍历画每个子图 综述 pytho
  • java远程连接linux并发送命令,两种方案比较Jsch与ganymed-ssh2

    通过Jsch连接 step 1引入jar包
  • k8s之ReplicaSet

    我们在定义pod资源时 可以直接创建一个kind Pod类型的自主式pod 但是这存在一个问题 假如pod被删除了 那这个pod就不能自我恢复 就会彻底被删除 线上这种情况非常危险 所以今天就给大家讲解下pod的控制器 所谓控制器就是能够管
  • Log4cpp:为中小型C++项目加上log支持

    对于一个上点规模的C 项目而言 Log的作用是毋庸置疑的 出问题的时候 看了Log 常见的问题处理起来自是方便不过 即使遇到麻烦的问题 也可以从 总发现不少蛛丝马迹 因此一个严肃的项目应该从一开始就好好考虑如何打Log 便于分析 维护 现实
  • Selenium3自动化测试【6】浏览器driver的安装(FireFox)

    Selenium支持各种浏览器 读者可以在不同的浏览器中开展自动化测试 它支持的浏览器包括IE FireFox Chrome Opera Safari等 本讲就围绕常用的FireFox Chrome与Selenium的结合进行讲解 由于Se
  • 遥测终端机RTU助力城市内涝监测系统

    一 背景概述 2023年第5号台风 杜苏芮 周末登陆福建晋江 一波未平一波又起 卡努台风也进入了48小时警戒线 台风侵袭给城市基础设施和居民生活带来了严重的影响 后面第11号台风 海葵 号随之带来了更多城市内涝问题 且难以一下子解决 为了有
  • iOS 开发之CocoaPods常用第三方框架导入

    1 使用终端打开文件 假设项目放在桌面上 cd Desktop cd 项目名称 2 创建Podfile文件 命令如下 vim Podfile 3 输入 i 进入编辑模式并copy下面的这段代码 platform ios 8 0 target
  • C语言比较两个字符串是否相等的案例讲解

    思路分析 比较两个字符串是否相等要看两个字符串的长度和内容是否一样 如果长度和内容有一个不一样那么这两个字符串不相等 方法1 strcmp函数可以比较2个字符串的大小和内容是否一样 我们可以使用这个函数来进行判断 知识补充 strcmp函数
  • Node.js——回调函数及事件处理机制

    目录 回调函数 定义 理解 事件处理机制 补充 回调函数 定义 什么是回调函数呢 通俗的讲 将一个函数A作为参数传递给函数B 在函数B内对函数A进行调用 函数A就是回调函数 Node js 异步编程的直接体现就是回调 回调函数在完成任务后就