1. 程式人生 > >Node.js 事件佇列娓娓道來

Node.js 事件佇列娓娓道來

Node.js EventEmitter 事件佇列

Node.js 所有的非同步 I/O 操作在完成時都會發送一個事件到事件佇列。

下面我們來詳解事件佇列的方法和例項

方法:

1.addListener(event, listener)
為指定事件新增一個監聽器到監聽器陣列的尾部。

2.on(event, listener)
為指定事件註冊一個監聽器,接受一個字串 event 和一個回撥函式。

3.once(event, listener)
為指定事件註冊一個單次監聽器,即 監聽器最多隻會觸發一次,觸發後立刻解除該監聽器。

4.removeListener(event, listener)
移除指定事件的某個監聽器,監聽器 必須是該事件已經註冊過的監聽器。 

5.
removeAllListeners([event]) 移除所有事件的所有監聽器, 如果指定事件,則移除指定事件的所有監聽器 6.setMaxListeners(n) 預設情況下, EventEmitters 如果你新增的監聽器超過 10 個就會輸出警告資訊。 setMaxListeners 函式用於提高監聽器的預設限制的數量。 7.listeners(event) 返回指定事件的監聽器陣列。 8.emit(event, [arg1], [arg2], [...]) 按引數的順序執行每個監聽器,如果事件有註冊監聽返回 true,否則返回 false

類方法

1.listenerCount(emitter
, event) 返回指定事件的監聽器數量。

事件

1.newListener
    event - 字串,事件名稱
    listener - 處理事件函式
該事件在新增新監聽器時被觸發

2.removeListener
    event - 字串,事件名稱
    listener - 處理事件函式
從指定監聽器陣列中刪除一個監聽器。需要注意的是,此操作將會改變處於被刪監聽器之後的那些監聽器的索引。

案例一:每隔1s觸發事件
event1.js

// 引入 events 模組
var events = require('events');
// 建立 EventEmitter 物件
var eventEmitter = new events.EventEmitter(); // 註冊監聽器 eventEmitter.on('some_event', function () { console.log('some_event 事件觸發'); }); // 計時器 setInterval(function () { // 觸發 some_event 監聽器 eventEmitter.emit('some_event'); }, 1000);

這裡寫圖片描述
案例二:向事件佇列中傳參
event2.js

var events = require('events');

var eventEmitter = new events.EventEmitter();

eventEmitter.on('listener', function (arg1, arg2) {
    console.log('listener1', arg1, arg2);
})

eventEmitter.on('listener', function (arg1, arg2) {
    console.log('listener2', arg1, arg2);
});

eventEmitter.emit('listener', 'zhang', 'li');

這裡寫圖片描述

案例三:為同一個監聽器註冊兩個事件處理程式

var events = require('events');

var eventEmitter = new events.EventEmitter();

var listener1 = function (arg1, arg2) {
    console.log('listener1', arg1, arg2);
};
var listener2 = function (arg1, arg2) {
    console.log('listener2', arg1, arg2);
};
// 註冊監聽器
eventEmitter.on('listener', listener1);
eventEmitter.on('listener', listener2);
// 觸發監聽器事件
// eventEmitter.emit('listener', 'zhang', 'li');

var listenerLength = require('events').EventEmitter.listenerCount(eventEmitter, 'listener');
eventEmitter.emit('listener', 'zhang', 'li');
console.log('listener 監聽器註冊 ' + listenerLength + ' 個事件處理函式');

這裡寫圖片描述