关键词:
【NodeJs-5天学习】第一天篇④ ——NodeJs回调函数和事件处理机制
面向读者群体
- ❤️ 电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识 ❤️
- ❤️ 业余爱好物联网开发者,有简单技术基础,想针对硬件功能构造简单的服务器❤️
- ❤️ 本篇创建记录 2023-03-12 ❤️
- ❤️ 本篇更新记录 2023-03-12 ❤️
技术要求
- 有HTML、CSS、JavaScript基础更好,当然也没事,就直接运行实例代码学习
专栏介绍
- 通过简短5天时间的渐进式学习NodeJs,可以了解到基本的服务开发概念,同时可以学习到npm、内置核心API(FS文件系统操作、HTTP服务器、Express框架等等),最终能够完成基本的物联网web开发,而且能够部署到公网访问。
🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝
1、Node.js 中的回调(Callback)函数
回调定义:将一个函数A作为参数传递给函数B,在函数B内对函数A进行调用,函数A就是回调函数
。
Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。 而回调的使用在NodeJs上集中于它本身的异步编程
。
Node.js 是
单进程单线程
应用程序,但是通过事件和回调支持并发,所以性能非常高
。如果我们使用了同步,假设有一个处理耗时非常长,那么其他操作就必须阻塞等待它完成,这在服务开发中属于严重性能问题。
- 非必要不使用同步接口。
- 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
回调函数一般作为函数的最后一个参数出现:
function foo1(name, age, callback)
function foo2(value, callback1, callback2)
例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
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程序已经执行结束
//文件内容
- fs就是操作文件系统的内置库。
2、Nodejs事件循环模型
讲完回调,就得说说NodeJs的事件驱动机制,并且这两者是密不可分。
2.1 浅析事件驱动
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数
。
2.2 深入NodeJs事件驱动
参考文献:
下面是一张 Node.js 早期的架构图,来自 Node.js 之父 Ryan Dahl 的演讲稿,在今天依然不过时,它简要的介绍了 Node.js 是基于 Chrome V8引擎构建的,
- 由
事件循环(Event Loop)分发 I/O 任务
- 最终
工作线程(Work Thread)将任务丢到线程池(Thread Pool)里去执行
- 而
事件循环只要等待执行结果
就可以了。
- Chrome V8 是 Google 发布的开源 JavaScript 引擎,采用 C/C++ 编写,在 Google 的 Chrome 浏览器中被使用。Chrome V8 引擎可以独立运行,也可以用来嵌入到 C/C++ 应用程序中执行。
Event Loop
事件循环(由 libuv 提供)Thread Pool
线程池(由 libuv 提供)
梳理一下
- Chrome V8 是 JavaScript 引擎
- Node.js 内置 Chrome V8 引擎,所以它使用的 JavaScript 语法
- JavaScript 语言的一大特点就是
单线程
,也就是说,同一个时间只能做一件事- 单线程就意味着,
所有任务需要排队,前一个任务结束,才会执行后一个任务。
如果前一个任务耗时很长,后一个任务就不得不一直等着。- 如果排队是因为计算量大,CPU 忙不过来,倒也算了,但是很多时候 CPU 是闲着的,因为 I/O 很慢,不得不等着结果出来,再往下执行
- CPU 完全可以不管 I/O 设备,挂起处于等待中的任务,先运行排在后面的任务
- 将等待中的
I/O 任务
放到Event Loop
里- 由 Event Loop 将 I/O 任务放到
线程池
里- 只要有资源,就尽力执行
从底层代码实现来看,
梳理一下
- Chrome V8 解释并执行 JavaScript 代码(这就是为什么浏览器能执行 JavaScript 原因)
- libuv 由事件循环和线程池组成,负责所有 I/O 任务的分发与执行
- 在Node.js Bindings层做的事儿就是将 Chrome V8 等暴露的 C/C++ 接口转成
JavaScript Api
,并且结合这些 Api 编写了 Node.js 标准库,所有这些 Api 统称为 Node.js SDK
我们在写代码的时候,由 Event Loop 来接受处理,而真正执行操作的是具体的线程池里的 I/O 任务。之所以说 Node.js 是单线程,就是因为在接受任务的时候是单线程的,它无需进程/线程切换上下文的成本,非常高效,但它在执行具体任务的时候是多线程的。
举个例子:
- 快递仓库有一条传送带(
Event Loop
),源源不断把快递传送过来,两边的工人
(Thread Pool
)不断分拣装车派发到全国各地。
3、总结
篇④主要讲解了一下回调函数的定义以及NodeJs中经典的事件驱动模型(特别是单线程性能)。当然,对于初学者不理解也没有问题,先有个概念。
思考:
- 如果要实现多线程操作怎么办?
物联网服务nodejs-5天学习第一天篇②——安装nodejs环境以及vscode开发工具(代码片段)
【NodeJs-5天学习】第一天篇②——安装环境以及开发工具1、Node.js环境安装1.1下载安装文件1.2安装步骤1.3常规配置,主要是NPM1.3.1查看配置1.3.2配置国内下载镜像1.3.3尝试下载安装包1.4NPM使用介绍1.4.1查看当前npm版本——npm-v、np... 查看详情
物联网服务nodejs-5天学习第一天篇③——vscode上运行第一个nodejs程序,配置自动重启插件nodemon(代码片段)
...,验证自动重启效果4、总结面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能... 查看详情
基于物联网的nodejs-5天学习入门指引
...一天第二天第三天第四天第五天面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能... 查看详情
物联网服务nodejs-5天学习第三天实战篇④——qq机器人,实现自动回复重要提醒(代码片段)
....2.3群聊匹配词2.3测试效果3.总结面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能... 查看详情
物联网服务nodejs-5天学习第四天存储篇④——基于mqtt的环境温度检测,升级存储为mysql(代码片段)
...outer3.ESP8266代码4.测试效果4.总结面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能... 查看详情
物联网服务nodejs-5天学习第二天篇④——项目模块化(代码片段)
...器入口模块——app_server.js5.总结面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能... 查看详情
物联网服务nodejs-5天学习第三天实战篇②——基于物联网的wifi自动打卡考勤系统(代码片段)
【NodeJs-5天学习】第三天实战篇②——基于物联网的WiFi自动打卡考勤系统1.前言2.实现思路2.1NodeJs服务器代码2.1.1对接Express服务器2.1.2对接Mac地址处理2.1.3对接飞书群处理2.2ESP8266代码2.3测试效果2.3.1串口打印日志2.3.2NodeJs服务器打... 查看详情
物联网服务nodejs-5天学习第三天实战篇③——基于mqtt的环境温度检测(代码片段)
...c;这里以#1为例2.3测试效果4.总结面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能... 查看详情
物联网服务nodejs-5天学习第四天存储篇②——nodejs连接操作mysql8.0(代码片段)
...表——CREATETABLE3.总结参考资料面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能构... 查看详情
物联网服务nodejs-5天学习第四天存储篇①——安装使用mysql8.0(代码片段)
...odeJs数据库2.4.5运行sql语句3.总结面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能... 查看详情
物联网服务nodejs-5天学习第二天篇①——fs文件系统(代码片段)
...2.8读取目录2.9删除目录3、总结面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能构... 查看详情
物联网服务nodejs-5天学习第三天实战篇①——10行代码给她造个熬夜提醒睡觉机器人(代码片段)
...任务模块2.3.3编写10行代码3.总结面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能... 查看详情
物联网服务nodejs-5天学习第四天存储篇③——基于物联网的wifi自动打卡考勤系统,升级存储为mysql,提醒功能改为qq(代码片段)
【NodeJs-5天学习】第四天存储篇③——基于物联网的WiFi自动打卡考勤系统,升级存储为mysql,提醒功能改为QQ1.前言2.服务器代码2.1配置MySQL服务器2.2NodeJs服务器开发2.2.1对接Express服务器2.2.2对接Mac地址处理2.2.3对接QQ群处理3... 查看详情
物联网服务nodejs-5天学习第二天篇③——expressweb框架和中间件(代码片段)
【NodeJs-5天学习】第二天篇③——ExpressWeb框架和中间件1.前言1.1Express简介1.2Express能做什么2.Express快速入门2.1①安装`express`、`body-parser`、`moment`模块2.2②导入`express`、`body-parser`模块2.3③创建web服务器... 查看详情
物联网nodejs-5天学习第四天存储篇⑤——pm2,node.js应用进程管理器(代码片段)
...方式接入(可选)7.总结面向读者群体❤️电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识❤️❤️业余爱好物联网开发者,有简单技术基础,想针对硬件功能... 查看详情
物联网服务nodejs-5天学习第二天篇②——网络编程(tcphttpweb应用服务)(代码片段)
【NodeJs-5天学习】第二天篇②——网络编程1、client/server结构2.服务器相关概念2.1IP地址和端口号2.2DNS域名服务3.构建TCP3.1TCP3.2创建TCP服务器端3.2.1导入`net`模块3.2.2创建`TCP服务器实例`,监听socket事件3.2.2.1connect事件3... 查看详情
学习linux第一天-了解iaaspaassaas
...信,SDK,API,视频会议,融合通信,云呼叫中心,电话机器人,物联网、物联网卡、物联网平台、流量分发平台,隐 查看详情
物联网必学清单
当然有!物联网(IoT)是一个非常热门的领域,涉及到数据采集、通信和智能设备等多个方面。在成为物联网专家的道路上,以下是一些建议和资源:1.学习基础知识熟悉物联网的基本概念,了解主要的应用场景和技术挑战。学... 查看详情