node.js中基本上全部的事件机制都是采用观察者模式实现。
node.js单线程相似进入一个while(true)的事件循环,直到没有事件观察者退出,每一个异步事件都生成一个事件观察者,若是有事件发生就调用该回调函数。node
node.js事件驱动流程
node.js使用事件驱动模型,当web server接收到请求,就把它关闭而后转给子线程处理业务,主线程去服务下一个web请求。
当子线程完成此次请求的业务,它会被放到一个队列中,当它到了队列的出口,就会触发回调函数,将这个结果返回给用户。
在这个事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
事件的驱动流程比较像 观察者模式,事件至关于一个主题(Subject),全部注册到这个事件上的处理函数至关于观察者(Observer)。
以下是node.js的事件实例web
//载入 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('程序执行完毕');
执行结果异步
上述代码执行流程
1>eventEmitter.emit('connection'),触发id = 'connection'对应的事件
2>'connection'绑定的事件是connectHandler
3>connectHandler是方法function connected()返回的结果,因此进去该方法
4>打印出'链接成功'
5>触发id='data_received'对应的事件
6>'data_received'对应的是方法function()
7>该方法执行 打印出'数据接收成功'
8>事件部分处理完毕,执行最后'程序处理完毕'函数