Node.js 全部的異步 I/O 操做在完成時都會發送一個事件到事件隊列json
Node.js 裏面的許多對象都會分發事件:一個 net.Server 對象會在每次有新鏈接時觸發一個事件, 一個 fs.readStream 對象會在文件被打開的時候觸發一個事件。 全部這些產生事件的對象都是 events.EventEmitter 的實例app
NodeJs事件監聽觸發機制依賴 events 核心模塊,異步
events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是事件觸發與事件監聽器功能的封裝ui
咱們來看看它的基本用法this
const EventEmitter = require('events').EventEmitter //實例化EventEmitter類 const event = new EventEmitter() //error是特殊事件,系統自動觸發,若是程序沒有設置監聽器的話,系統遇到錯誤會拋出,終止代碼運行 event.on('error', err => { console.log(err) }) //添加事件監聽 event.on('init', () => { console.log(`初始化...`) }) //能夠給一個事件設設置多個監聽器 event.on('data', reciveData) event.on('data', processData) //默認最多爲一個事件設置10個監聽器,能夠經過如下方法修改 // event.setMaxListeners(11) event.on('close', () => { console.log(`結束..`) }) //移除監聽器 event.removeListener('data',reciveData) function reciveData(data){ console.log(`收到數據: ${data}`) } function processData(data){ console.log(`處理數據: ${data}`) } event.emit('init') setTimeout(()=>{ //觸發事件,若是事件沒被監聽返回 false event.emit('data','ABCDEFG') },1000) setTimeout(()=>{ //觸發事件 event.emit('close') },2000)
以上代碼介紹了eventEmitter的所有用法,可能咱們會問這個eventEmitter有什麼卵用嗎?url
大多數時候咱們不會直接使用 EventEmitter,而是在對象中繼承它spa
例如咱們經常使用的方法 http.get 方法,該方法傳入兩個參數prototype
參數1:須要請求urlcode
參數2:http.IncomingMessage實例,而這個對象正是繼承 eventEmitter 對象對象
下面代碼大概模擬了了http.get工做原理
const EventEmitter = require('events').EventEmitter var myHttp = {} myHttp.incomingMessage = function(statusCode, headers){ this.statusCode = statusCode this.headers = headers } myHttp.incomingMessage.prototype = new EventEmitter() myHttp.get = function(url, fn){ //僞代碼:獲取url內容 var im = new this.incomingMessage(200,{'content-type': 'json/application'}) fn(im) im.emit('data',`來自${url}的數據`) } module.exports = myHttp
使用
const myHttp = require('./event.js') myHttp.get('http://www.baidu.com', res => { console.log(res) res.on('data', data => { console.log(data) }) })