EventEmitter:nodeJs事件觸發機制

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)
    })
})
相關文章
相關標籤/搜索