NodeJS學習筆記 (21)事件機制-events(ok)
阿新 • • 發佈:2018-06-18
source 理解 SM 執行 hub 單個 nodejs index com
模塊概覽
events模塊是node的核心模塊之一,幾乎所有常用的node模塊都繼承了events模塊,比如http、fs等。
模塊本身非常簡單,API雖然也不少,但常用的就那麽幾個,這裏舉幾個簡單例子。
基礎例子
下面一共是6個例子,都非常簡單,可以直接拷貝出來運行。例子5比較有意思,雖然也並不復雜,但確實是容易記錯的點,感興趣的同學可以看下。
例子1:單個事件監聽器
var EventEmitter = require(‘events‘); class Man extends EventEmitter {} var man = new Man(); man.on(‘wakeup‘, function(){ console.log(‘man has woken up‘); }); man.emit(‘wakeup‘); // 輸出如下: // man has woken up
例子2:同個事件,多個事件監聽器
可以看到,事件觸發時,事件監聽器按照註冊的順序執行。
var EventEmitter = require(‘events‘);
class Man extends EventEmitter {}
var man = new Man();
man.on(‘wakeup‘, function(){
console.log(‘man has woken up‘);
});
man.on(‘wakeup‘, function(){
console.log(‘man has woken up again‘);
});
man.emit(‘wakeup‘);
// 輸出如下:
// man has woken up
// man has woken up again
例子3:只運行一次的事件監聽器
var EventEmitter = require(‘events‘); class Man extends EventEmitter {} var man = new Man(); man.on(‘wakeup‘, function(){ console.log(‘man has woken up‘); }); man.once(‘wakeup‘, function(){ console.log(‘man has woken up again‘); }); man.emit(‘wakeup‘); man.emit(‘wakeup‘); // 輸出如下: // man has woken up // man has woken up again // man has woken up
例子4:註冊事件監聽器前,事件先觸發
可以看到,註冊事件監聽器前,事件先觸發,則該事件會直接被忽略。
var EventEmitter = require(‘events‘); class Man extends EventEmitter {} var man = new Man(); man.emit(‘wakeup‘, 1); man.on(‘wakeup‘, function(index){ console.log(‘man has woken up ->‘ + index); }); man.emit(‘wakeup‘, 2); // 輸出如下: // man has woken up ->2
例子5:異步執行,還是順序執行
例子很簡單,但非常重要。究竟是代碼1先執行,還是代碼2先執行,這點差異,無論對於我們理解別人的代碼,還是自己編寫node程序,都非常關鍵。
實踐證明,代碼1先執行了。(node v6.1.0)
var EventEmitter = require(‘events‘); class Man extends EventEmitter {} var man = new Man(); man.on(‘wakeup‘, function(){ console.log(‘man has woken up‘); // 代碼1 }); man.emit(‘wakeup‘); console.log(‘woman has woken up‘); // 代碼2 // 輸出如下: // man has woken up // woman has woken up
例子6:移除事件監聽器
var EventEmitter = require(‘events‘);
function wakeup(){
console.log(‘man has woken up‘);
}
class Man extends EventEmitter {}
var man = new Man();
man.on(‘wakeup‘, wakeup);
man.emit(‘wakeup‘);
man.removeListener(‘wakeup‘, wakeup);
man.emit(‘wakeup‘);
// 輸出如下:
// man has woken up
相關鏈接
https://nodejs.org/api/events.html
NodeJS學習筆記 (21)事件機制-events(ok)