Node.js的事件机制
Node.js是单进程单线程应用程序,但是痛过事件和回电支持并发。
Node.js的每一个API都是一步的,并作为一个独立的线程运行,使用一步异步函数回调,并处理。
Node.js 基本上所有的事件机制都是用设计模式中的观察者模式实现的
Node.js 当线程类似进入一个while的事件循环,直到没有事件观察者推出,妹进入异步事件都会生成一个观察者,如果有事件发生就调用该函数
事件驱动程序 ##
事件驱动程序的主要参与者有两个EventEmitters对象和EventHandlers(回调函数)。
我们设置一个事件,主要通过以下流程
1.引入events模块 ,实例化EventEmitter类来绑定和监听事件
//引入events模块
var events = require('events');
//创建eventEmitter对象
var eventEmitter = new events.EventEmitter();
2.绑定事件处理程序(函数),绑定函数有两种方式,一种直接绑定已知的函数名,一种是绑定匿名函数
//创建事件处理函数
var connectHandler = function connected(){
console.log('连接成功');
}
//绑定connectHandler到connection事件上
eventEmitter.on('connection',connectHandler);
//使用匿名函数绑定data_received事件
eventEmitter.on('data_received',function(){
console.log('数据接收成功。');
})
3.通过EventEmitter.emit函数来触发事件,回调函数
//触发上面绑定的connection事件
eventEmitter.emit('connection');
//触发上面绑定匿名函数的data_received事件
eventEmitter.emit('data_received');
详细代码如下:
// 引入 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执行异步操作
Node里面我们经常会使用内置的异步回调操作,回调函数接收错误对象作为第一个参数。如下面代码的err就是错误信息作为参数
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err){
console.log(err.stack);
return;
}
console.log(data.toString());
});
console.log("程序执行完毕");
如果读取文件过程发生错误,错误err对象就会输出错误信息,如果没有发生错误,readFile跳过err对象,文件内容会通过回调函数的参数data输出。