1. 程式人生 > >Nodejs學習筆記 day03----繫結事件

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)
為指定事件註冊一個監聽器,接受一個字串 event 和一個回撥函式。

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)
預設情況下, EventEmitters 如果你新增的監聽器超過 10 個就會輸出警告資訊。 setMaxListeners 函式用於提高監聽器的預設限制的數量。

7

listeners(event)
返回指定事件的監聽器陣列。

8

emit(event, [arg1], [arg2], [...])
按引數的順序執行每個監聽器,如果事件有註冊監聽返回 true,否則返回 false

 

 

序號

方法 & 描述

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);

執行結果如下: