today, 咱們的話題做文是nodejs,我嘗試對它的描述是:似曾類似,但它又不同的存在着。百花齊放的it世界裏,以獨特身姿綻開的美麗更容易吸引人。也許只是不瞭解,也許時間會給出答案,nodejs你值得擁有。node
本篇瞭解一下nodejs的事件驅動。設計模式
Node.js 事件循環數組
Node.js 是單進程單線程應用程序,可是經過事件和回調支持併發,因此性能很是高。併發
Node.js 的每個 API 都是異步的,並做爲一個獨立線程運行,使用異步函數調用,並處理併發。異步
Node.js 基本上全部的事件機制都是用設計模式中觀察者模式實現。函數
Node.js 單線程相似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每一個異步事件都生成一個事件觀察者,若是有事件發生就調用該回調函數.性能
事件發射器:EventEmitter
類ui
經過 require('events').EventEmitter
獲取 EventEmitter 類。spa
經過一個列子來看一下EventEmitter類中事件發送以及事件監聽的功能封裝。線程
建立events.js文件:
var EventEmitter=require("events").EventEmitter;
var events=new EventEmitter();
events.on("Click",function(){
console.log("This Click Event");
});
setTimeout(function(){
events.emit("Click");
},1000);
執行腳本:
E:\NodeJS>node events.js
This Click Event
emitter.on(event, listener)
添加一個監聽者到特定 event
的監聽數組的尾部,觸發器不會檢查是否已經添加過這個監聽者。 屢次調用相同的 event
和 listener
將會致使 listener
添加屢次。
好比說往events.js中編寫以下內容:
var EventEmitter=require("events").EventEmitter;
var events=new EventEmitter();
events.on("Click",function(){
console.log("This Click Event 1");
});
events.on("Click",function(){
console.log("This Click Event 2");
});
setTimeout(function(){
events.emit("Click");
},1000);
執行腳本:
E:\NodeJS>node events.js
This Click Event 1
This Click Event 2
事件都會被監聽,並且會依次執行。
emitter.addListener(event, listener)或者emitter.once(event, listener)
給事件添加一個一次性的 listener,這個 listener 只會被觸發一次,以後就會被移除。沒有監聽的事件將一直處於等待狀態。
好比說往events.js中編寫以下內容:
var EventEmitter=require("events").EventEmitter;
var events=new EventEmitter();
events.once("Click1",function(){
console.log("This Click Event 1");
});
events.on("Click2",function(){
console.log("This Click Event 2");
});
setInterval(function(){
events.emit("Click1");
},1000);
setInterval(function(){
events.emit("Click2");
},1000);
執行腳本:
E:\NodeJS>node events.js
This Click Event 1
This Click Event 2
This Click Event 2
once註冊的事件只會被監聽一次,其後將不會被觸發。
emitter.removeListener(event, listener)
從一個某個事件的 listener 數組中移除一個 listener。
好比說往events.js中編寫以下內容:
var EventEmitter=require("events").EventEmitter;
var events=new EventEmitter();
var callback1=function(){
console.log("This Click Event 1");
}
var callback2=function(){
console.log("This Click Event 2");
}
events.on("Click",callback1);
events.on("Click",callback2);
events.removeListener("Click",callback2);
setTimeout(function(){
events.emit("Click");
},1000);
執行腳本:
E:\NodeJS>node events.js
This Click Event 1
被移出監聽的事件其後將不會被觸發。removeListener
最多會移除數組裏的一個 listener。若是屢次添加同一個 listener 到數組,那就須要屢次調用removeListener
來移除每個實例。
emitter.removeAllListeners([event])
移出全部監聽事件。
emitter.setMaxListeners(n)
設置每一個監聽事件的最大個數。
EventEmitter.defaultMaxListeners
設置每一個監聽事件的默認個數。
emitter.listeners(event)
返回事件的 listener 數組。
emitter.emit(event[, arg1][, arg2][, ...])
使用指定的參數順序的執行每個 listener.
若是事件有 listener,返回 true
, 不然 false