2013-04-10 39 views
1

我在某些類中使用EventEmitter,但是我真的很困惑事件偵聽和事件發射是否比調用對象方法更有效?JavaScript類上的事件或函數

我希望對象能夠偵聽發送給它的大量事件,並且還會將大量事件發送到最初將事件發送到對象以及其他對象的對象。

而且我很困惑我是否應該在什麼時候使用函數,然後調用其他對象方法等等。

+2

當一個簡單的函數調用可以在所有情況下工作時,請勿使用事件。對於函數調用,調用者必須知道被調用的是哪個對象。如果有時候,發射器不知道(或不知道)哪些對象正在偵聽,那麼使用事件就是這種情況。 @LeeMeador @ – 2013-04-10 15:41:57

+0

有道理。 – Gntem 2013-04-10 16:18:52

回答

2

事件改善模塊解耦。這是一個簡單的問題:「我需要觸摸多少個文件才能修改或添加特徵X?」

一個簡單的例子:你有一個web服務器,一個日誌模塊和一個啓動腳本,它們在啓動時連接在一起。函數調用方式如下所示:

// Startup.js 
var Startup = function() { 
    var logger = new Logger(); 
    var server = new Server(logger); 
}; 

// Logger.js 
var Logger = function() { 
}; 
Logger.prototype.log = function(msg) { 
    console.log(msg); 
}; 

// Server.js 
var Server = function(logger) { 
    this.logger = logger; 
}; 
Server.prototype.start() { 
    this.logger.log("Start server..."); 
}; 

您可以看到Startup知道所有類,Server知道關於記錄器以及如何使用它。如果我想重命名記錄器的功能日誌來寫我必須觸摸記錄器和服務器。

現在讓我們來看看一個事件驅動方式:

// Startup.js 
var Startup = function() { 
    var logger = new Logger(); 
    var server = new Server(); 
    server.addListener(logger); 
}; 

// Logger.js 
var Logger = function() { 
    this.on("startup", function(msg) { 
     console.log(msg); 
    }); 
}; 
Logger.prototype.__proto__ = EventEmitter.prototype; 

// Server.js 
var Server = function() { 
}; 
Server.prototype.start() { 
    this.emit("startup", "Start server..."); 
}; 
Server.prototype.__proto__ = EventEmitter.prototype; 

現在記錄器和服務器不知道對方。我可以重新命名日誌,我必須觸摸的是Logger.js。我甚至可以刪除記錄器或添加更多的記錄器,所有這些記錄器都與服務器一起工作。但我從來沒有碰過Server.js。

這是一個簡單的例子,解耦在這裏看起來不重要。但是一個項目越大,獲得的利益就越多。

你可以單元測試服務器,而不必模擬記錄器。 Logger只是一個依賴項。想象一下,如果服務器有五個或更多的子模塊需要模擬,那麼優勢就是如此。

我希望這可以幫助您瞭解事件驅動架構的好處。