我一直在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,并且看到它基本上在客户端和服务器端都发出并监听相同的对象,所以也许这使我感到困惑。
在任何情况下,使用一种方法可能比另一种方法更合适吗?
几个注意事项可能会消除一些困惑:
事件是指事情发生的时间。(例如error
发生了,data
可用)
在几乎所有情况下,都应从对象本身发出事件。调用对象之外的东西没有意义.emit()
。.emit()
仅从内部呼叫。
在您的函数示例中changenumber
,您肯定应该在这里使用一个函数。呼叫时timer.changenumber()
,您正在告诉计时器更改其号码。呼叫时timer.emit('changenumber')
,实际上是代表计时器在说数字已经更改。更糟糕的是,计时器正在自言自语。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句