Nodejs學習筆記 day03----繫結事件
事件驅動程式:
當web server接收到請求,就把它關閉然後進行處理,然後去服務下一個web請求。
當這個請求完成,它被放回處理佇列,當到達佇列開頭,這個結果被返回給使用者。
webserver一直接受請求而不需要等待讀寫操作(非阻塞式IO)
var es = require('events'); var ee = new es.EventEmitter(); ee.on('eventName',function () { console.log('hello word'); }); //繫結方法 ee.emit('eventName'); //觸發方法
執行結果如下:
on(arg1,arg2);
繫結方法,第一個引數是觸發條件,第二個引數為觸發的方法。
通過檢視原始碼可以知道,它的原理在於,建立一個名為events的陣列,繫結方法的時候,如果該觸發條件沒有繫結相應的方法(即events[‘eventName’]不存在),那麼就將該方法賦值給events[‘eventName’],如果存在且該函式優先考慮,則events[‘eventName’] = [new function,old function]反之為events[‘eventName’] = [old function,new function],如果events[‘eventName’]的型別不為function,則將新的方法壓入棧。
var events = require('events'); var ee = new events.EventEmitter(); var Handler = function conn() { console.log('繫結第一個event.'); ee.emit('event2'); }; ee.on('event1',Handler); ee.on('event2',function () { console.log('繫結第二個event'); }); ee.emit('event1');
執行結果如下:
常用方法:
序號 |
方法 & 描述 |
1 |
addListener(event, listener) |
2 |
on(event, listener) server.on('connection', function (stream) { console.log('someone connected!'); }); |
3 |
once(event, listener) server.once('connection', function (stream) { console.log('Ah, we have our first user!'); }); |
4 |
removeListener(event, listener) 移除指定事件的某個監聽器,監聽器必須是該事件已經註冊過的監聽器。 它接受兩個引數,第一個是事件名稱,第二個是回撥函式名稱。 var callback = function(stream) { console.log('someone connected!'); }; server.on('connection', callback); // ... server.removeListener('connection', callback); |
5 |
removeAllListeners([event]) |
6 |
setMaxListeners(n) |
7 |
listeners(event) |
8 |
emit(event, [arg1], [arg2], [...]) |
序號 |
方法 & 描述 |
1 |
listenerCount(emitter, event) |
events.emitter.listenerCount(eventName) //推薦
好像看不出addListener和on方法之間的差別(或者可以說它們幾乎沒有區別)
var functionOne = function() {
// Some code
};
function functionTwo() {
// Some code
}
首先了解這兩個函式的差別,它們基本沒有差別,除了第二個函式在程式碼為執行到時就可以引用,而第一個函式必須程式碼執行到它才能使用。
var events = require('events');
var ee = new events.EventEmitter();
var l1 = function () {
console.log("1-->監聽器執行");
};
var l2 = function () {
console.log("2-->執行監聽器");
};
ee.addListener('test1',l1);
ee.on('test2',l2);
var num = ee.listenerCount('test1');
console.log(num);
console.log(ee.listenerCount('test'));
ee.removeAllListeners('test1');
ee.on('test1',l1,l2);
// 執行時編譯器沒有報錯…但從執行結果可以看出,當你給的引數是多個方法時,只繫結第一個方法
console.log(ee.listenerCount('test1'));
console.log(ee.emit('test1'));
ee.removeListener('test1',l1);
執行結果如下:
var events = require('events');
var ee = new events.EventEmitter();
var l1 = function () {
console.log("1-->監聽器執行");
};
var l2 = function () {
console.log("2-->執行監聽器");
};
ee.addListener('test1',l1);
ee.on('test2',l2);
var num = ee.listenerCount('test1');
console.log(num);
console.log(ee.listenerCount('test'));
ee.removeAllListeners('test1');
ee.on('test1',l1,l2);
ee.on('test1',l2);//test1綁定了兩個方法
console.log(ee.listenerCount('test1'));
console.log(ee.emit('test1'));當觸發監聽器時,依次執行繫結的所有方法
ee.removeListener('test1',l1);
執行結果如下: