单进程+单线程
Node是单进程单线程的程序,V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
事件驱动
Node是以事件驱动的程序,所谓事件驱动,指的是我们在前端使用http请求后,在后端的所设置的监听响应
事件循环
当并发很多的事件的时候,会产生这样的事件循环模型
当web server接收到请求->就把它关闭然后进行处理,然后去服务下一个web请求。
->当这个请求完成->它被放回处理队列->当到达队列开头->这个结果被返回给用户。
main.js
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received');
}
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('数据接收成功。');
});
// 触发 connection 事件
eventEmitter.emit('connection');
console.log("程序执行完毕。");
执行后!
$ node main.js
连接成功。
数据接收成功。
程序执行完毕。
继承 EventEmitter
大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。
为什么要这样做呢?原因有两点:
首先,具有某个实体功能的对象实现事件符合语义, 事件的监听和发生应该是一个对象的方法。
其次 JavaScript 的对象机制是基于原型的,支持 部分多重继承,继承 EventEmitter 不会打乱对象原有的继承关系。
网友评论