nodejs的事件处理机制以及事件环机制

简介: nodejs的事件处理机制以及事件环机制ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使用module.exports导出接口。

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类中的方法如下:

img_8e9bdf81437f60b5c901ce12781b29a2.png
image.png
使用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运行的原理图如下所示:

img_1b1eb308fb51b5744e7d29d82589c07d.png
image.png

这个图是整个 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的处理是单线程的。
相关文章
|
26天前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第36天】在探索Node.js的奥秘之旅中,中间件的概念如同魔法一般,它让复杂的请求处理变得优雅而高效。本文将带你领略这一机制的魅力,从概念到实践,一步步揭示如何利用中间件简化和增强你的应用。
|
1月前
|
消息中间件 JavaScript 中间件
深入浅出Node.js中间件机制
【10月更文挑战第24天】在Node.js的世界里,中间件如同厨房中的调料,为后端服务增添风味。本文将带你走进Node.js的中间件机制,从基础概念到实际应用,一探究竟。通过生动的比喻和直观的代码示例,我们将一起解锁中间件的奥秘,让你轻松成为后端料理高手。
29 1
|
2月前
|
JSON JavaScript 中间件
深入浅出Node.js中间件机制
本文将带你探索Node.js中一个核心概念——中间件机制。我们将通过浅显的语言和生动的比喻,揭示中间件如何作为请求和响应之间的“交通枢纽”,在应用程序中起到至关重要的作用。从基础原理到实际应用,你将了解到中间件不仅简化了代码结构,还提高了开发效率,是Node.js开发不可或缺的一部分。
54 1
|
2月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第4天】在探索Node.js的海洋中,中间件机制犹如一座灯塔,为开发者指引方向。本文将带你一探究竟,从浅入深地理解这一核心概念。我们将通过生动的比喻和实际代码示例,揭示中间件如何在请求和响应之间搭建桥梁,实现功能的扩展与定制。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
53 0
|
4月前
|
JavaScript 中间件 开发者
深入浅出Node.js中间件机制
【8月更文挑战第31天】本文将带你领略Node.js中间件的奥秘,通过直观的案例分析,揭示其背后的设计哲学。你将学会如何运用中间件构建强大而灵活的后端应用,以及在面对复杂业务逻辑时如何保持代码的清晰与高效。
|
4月前
|
设计模式 JavaScript 中间件
深入浅出Node.js中间件机制
【8月更文挑战第31天】在Node.js的世界里,中间件如同魔法般存在,它让复杂的请求处理变得井然有序。本文将带你领略中间件的奥秘,从原理到实战,一步步揭开它的神秘面纱。你将学会如何运用中间件来构建强大而灵活的后端应用,就像拼乐高一样有趣。
|
7月前
|
JavaScript 前端开发
Node.js中的错误处理机制
【4月更文挑战第30天】本文介绍了Node.js的错误处理机制,包括Error对象、try-catch、错误事件监听及Promise和async/await的错误处理。错误通常封装在Error对象中,可自定义错误类型。try-catch用于捕获异常,但不适用于异步错误。事件监听器处理对象发出的'error'事件,防止应用崩溃。Promise的.catch()和async/await结合try-catch用于处理异步错误。良好的错误处理是保证应用健壮性和可靠性的关键。
|
7月前
|
Web App开发 JavaScript 前端开发
了解 Node.js 的运行机制:从事件循环到模块系统(下)
了解 Node.js 的运行机制:从事件循环到模块系统(下)
了解 Node.js 的运行机制:从事件循环到模块系统(下)
|
7月前
|
JavaScript 前端开发 数据挖掘
了解 Node.js 的运行机制:从事件循环到模块系统(上)
了解 Node.js 的运行机制:从事件循环到模块系统(上)
了解 Node.js 的运行机制:从事件循环到模块系统(上)