nodejs的事件处理机制以及事件环机制
nodejs的事件处理机制以及事件环机制
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使用module.exports导出接口。
不把require和import整清楚,会在未来的标准编程中死的很难看。
require时代的模块
node编程中最重要的思想之一就是模块,而正是这个思想,让JavaScript的大规模工程成为可能。模块化编程在js界流行,也是基于此,随后在浏览器端,requirejs和seajs之类的工具包也出现了,可以说在对应规范下,require统治了ES6之前的所有模块化编程,即使现在,在ES6 module被完全实现之前,还是这样。
node的module遵循CommonJS规范,requirejs遵循AMD,seajs遵循CMD,虽各有不同,但总之还是希望保持较为统一的代码风格。
1.EventEmitter类
在Node.js中用于事件处理的event模块中,定义了一个EventEmitter类.所有可能触发的事件都是EventEmitter类子类的实例对象,EventEmitter类中的方法如下:
使用on方法绑定事件处理函数
var http = require('http'); var server = http.createServer(); server.on('request',function (req,res) { console.log(req.url); res.end('hello'); }); server.listen(1337,"127.0.0.1");
当我们请求1337端口的时候输出如下所示:
/ (注解:代表程序的根目录) /favicon.ico (注解:代表页面在收藏夹中的显示图标)
在默认情况下,针对同一事件最多可以绑定10个事件处理函数:
server.setMaxListeners(10)
用once只执行一次:
server.once('request',function (req,res) { console.log(req.url); res.end('hello'); });
2.获取指定事件的事件处理函数的数量
var http = require('http'); var events = require('events'); var server = http.createServer(); server.on('request', function (req,res) { if(req.url!='/favicon.ico'){ console.log('接收到客户端的请求'); } }); server.on('request', function (req,res) { if(req.url!='/favicon.ico'){ console.log(req.url); } res.end(); }); server.on('request', function (req,res) { if(req.url!='/favicon.ico'){ console.log('发送响应完毕'); } }); server.listen(1337,"127.0.0.1"); console.log(events.EventEmitter.listenerCount(server,'request'));
监听newListener和removeListener
var http = require('http'); var server = http.createServer(); var test = function () { server.on('request',function (req,res) { console.log("发送了"); }); } server.on('removeListener',function (e,f) { console.log("对"+e+"事件取消事件处理函数"); console.log(f); }); server.on('newListener',function (e,f) { console.log("对"+e+"事件添加事件处理函数"); console.log(f); }); server.on('request', function (req,res) { if(req.url!='/favicon.ico'){ console.log('接收到客户端的请求'); } }); server.on('request', function (req,res) { if(req.url!='/favicon.ico'){ console.log(req.url); } res.end(); }); server.on('request', function (req,res) { if(req.url!='/favicon.ico'){ console.log('发送响应完毕'); } }); server.on('request',test); server.removeListener('request',test); server.listen(1337,"127.0.0.1");
3.Node.js事件环机制
事件循环定义:当线程中的I/O任务完成之后就会执行指定的回调函数,并且将这个完成的事件放在事件队列的尾部,等待事件循环,当主线程再次循环到这个事件的时候,就会直接处理并且返回给上层调用,这个过程就是事件循环(Event Loop)。Node.js运行的原理图如下所示:
这个图是整个 Node.js 的运行原理,从左到右,从上到下,Node.js 被分为了四层,分别是 应用层、V8引擎层、Node API层和LIBUV层。
- 应用层:即 JavaScript 交互层,常见的就是 Node.js 的模块,比如 http,fs。
- V8引擎层:即利用 V8 引擎来解析JavaScript 语法,进而和下层 API 交互。
- Node API层:为上层模块提供系统调用,一般是由 C 语言来实现,和操作系统进行交互。
- LIBUV层:是跨平台的底层封装,实现了 事件循环、文件操作等,是 Node.js 实现异步的核心。
在Node.js的内部是通过线程池来完成I/O操作的,但是LIBUV层会针对不同的操作系统平台的差异性实现了统一调用,Node.js的单线程指的是JavaScript运行在单线程中,并不是说Node.js是单线程的,Node.js是一个多线程的平台,但是对于JavaScript的处理是单线程的。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
linux 安装python
1 软件安装 sudo apt-get install python2.7 2 源码安装 下载源码,目前最新版本是2.7.8,如果以后换了,可以在下面的命令中换版本号 源码也可以在网站上下载,具体见前述下载页面 wget http://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz 解压源码包 tar -zxvf Python-2.7.15.tgz 编译 cd Python-2.7.15 ./configure --prefix=/usr/local #指定了目录 make&&make install
- 下一篇
正火的 Spring Boot 2.0 更新了啥?
作为知名互联网公司都在用的技术,Spring Boot 2.0 的更新引起了很大的关注,本文将分为三部分解读 2.0 的更新: 第一类,基础环境升级; 第二类,默认软件替换和优化; 第三类,新技术的引入。 001 基础环境升级 Spring Boot 2.0 要求 Java 8 作为最低版本,许多现有的 API 已更新,以利用 Java 8 的特性。如果你正在使用 Java 7 或更早版本,则在开发 Spring Boot 2.0 应用程序之前,需要升级你的 JDK。 依赖组件升级: Spring Boot 2.0 基于 Spring Framework 5 构建,Spring Boot 升级依赖的第三方组件,主要有以下几个: Jetty 9.4,Jetty 是一个开源的 Servlet 容器,它为基于 Java 的 Web 内容,例如 JSP 和 Servlet 提供运行环境。Jetty 是使用 Java 语言编写的,它的 API 以一组 JAR 包的形式发布。 Tomcat 8.5,Apache Tomcat 8.5.x 旨在取代 8.0.x,完全支持 Java 9。 Flyw...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境