我一直在使用一些node.js包(Express,mqtt,socket.io)創建我自己的家庭自動化中心MongoDB數據庫和Angular在客戶端運行。這個項目是我第一次使用任何JavaScript,因此可以肯定地說我是一個小菜鳥。Derived node.js EventEmitter會在命名對象屬性中調用錯誤的偵聽器
我一直在解決派生的EventEmitter調用錯誤的偵聽器函數時被引用爲命名屬性的問題。下面是一個小例子,將說明此問題:
var EventEmitter = require('events').EventEmitter;
var debug = require('debug')('test.js');
var util = require('util');
var TestEmitter = function (initialState, name) {
var self = this;
EventEmitter.call(self);
this.state = initialState;
this.name = name;
this.setState = function (newState) {
self.emit('change', newState, this.state);
self.state = newState;
};
};
util.inherits(TestEmitter, EventEmitter);
var myObj = {
ary: [new TestEmitter(false, 'ary1'), new TestEmitter(true, 'ary2')],
named: {
name1: new TestEmitter(3, 'name1'),
name2: new TestEmitter(4, 'name2')
}
};
myObj.ary.forEach(function (aryEmitter) {
aryEmitter.on('change', function (newState) {
debug(aryEmitter.name + ' changed to: ' + newState);
});
});
for (var prop in myObj.named) {
var currEmitter = myObj.named[prop];
debug('prop = ' + prop);
debug('name = ' + currEmitter.name);
currEmitter.on('change', function (newState) {
debug(currEmitter.name + ' changed to: ' + newState);
});
}
myObj.ary[0].setState(true);
myObj.ary[1].setState(false);
myObj.named.name1.setState(4);
myObj.named.name2.setState(5);
實質上,TestEmitter
是從EventEmitter
派生的對象時,其setState
方法被調用,將廣播一個事件change
。
myObj
是對四個TestEmitter
實例的引用 - 兩個在數組中,兩個在命名屬性中。在創建myObj
後,我爲它們的每個change
事件註冊了一個偵聽器,該偵聽器僅將調試輸出寫入控制檯,其調用的回調名稱爲TestEmitter
。
但是,名爲TestEmitter
的引用不會以我期望的方式工作。撥打myObj.named.name1.setState(4)
以及myObj.named.name2.setState(5)
的電話都將執行我爲EventEmitter
myObj.named.name2
註冊的回叫功能。運行上面的所有內容將產生以下輸出:
test.js prop = name1 +0ms
test.js name = name1 +5ms
test.js prop = name2 +0ms
test.js name = name2 +0ms
test.js ary1 changed to: true +0ms
test.js ary2 changed to: false +0ms
test.js name2 changed to: 4 +0ms
test.js name2 changed to: 5 +0ms
任何人都可以提供任何幫助嗎?我已經閱讀了相當多的關於創建衍生EventEmitters
的最佳方法,它看起來像我採取正確的方法,所以我有點難住。
感謝您閱讀並提供任何幫助!
你'尋找'綁定'函數https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind或使用'forEach'循環中的箭頭函數 –