1. 程式人生 > >NodeJS學習筆記 (21)事件機制-events(ok)

NodeJS學習筆記 (21)事件機制-events(ok)

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)