我一直在Node中使用EventEmitters并遇到某些情况,我无法决定是否将值重新发送回' EventEmitter对象'并让它听取它们,或者只是调用一个函数来设置值。
我创建了一个简单的例子来解释我的观点。
myTimer函数只会发出每秒钟最喜欢的数字。它的值可以通过 changenumber 函数调用或 changenumber 事件来更改。
var util = require("util");
var events = require("events");
var favNo = 2;
var myTimer = function() {
var self = this;
events.EventEmitter.call(this);
setInterval(function() {
self.emit('favourite number', favNo);
}, 1000);
// on changenumber event, change number
this.on('changenumber', function (newNo) {
favNo = newNo;
});
}
util.inherits(myTimer, events.EventEmitter);
// on function call, change number
myTimer.prototype.changenumber = function(newNo) {
favNo = newNo;
}
module.exports = myTimer;
以下代码使用myTimer功能并收听其最喜欢的号码'事件。 可以通过功能调用或通过发出更改号码来设置喜欢的号码'在myTimer对象上。
var myTimer = require('./myTimer.js');
var timer = new myTimer();
timer.on("favourite number", function(number) {
console.log(number);
});
timer.changenumber(102); // change number using function.
timer.emit('changenumber', 102); // change number by emitting number
这两种方法似乎都有效,但是如果复杂度增加,使用emit来发回值似乎很难理解。我一直在我的项目中使用socket.io,并且已经看到它基本上发出并监听客户端和服务器端的同一个对象,所以也许这就是我感到困惑的地方。
是否有任何情况下使用一种方法可能比另一种方法更合适?
答案 0 :(得分:1)
一些注释可能会让人感到困惑:
事件发生时会发生事件。 (例如,error
已发生,data
可用)
几乎在所有情况下,都应从对象内部发出事件。对象之外的某些东西调用.emit()
是没有意义的。只能从内部拨打.emit()
。
在你的函数示例changenumber
中,你肯定应该在这里使用一个函数。当您拨打timer.changenumber()
时,您告诉计时器更改其号码。当您致电timer.emit('changenumber')
时,您实际上代表计时器发言,该号码已经更改。更糟糕的是,计时器正在与自己说话。