Node.js – 发射vs函数调用

我一直在使用Node中的EventEmitter,并遇到某些情况,我不能决定是否将值发回“EventEmitter对象”并让它监听它们,或者只是调用一个函数来设置值。

我已经创build了一个简单的例子来解释我的观点。

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 

这两种方法似乎都行得通,但是如果复杂性增长,使用发射发回值似乎很难遵循。 我一直在我的项目中使用socket.io,并已经看到它基本上发出和侦听客户端和服务器端的同一个对象,所以也许这就是我已经变得困惑。

有没有使用一种方法比其他方法更合适的情况?

一对夫妇指出,可能会澄清一些混乱:

  • 事情发生的时候。 (例如发生errordata可用)

  • 在几乎所有情况下,事件都应该从对象本身中发出。 调用.emit()对象之外的东西是没有意义的。 只能从内部调用.emit()

在你的函数示例changenumber ,你一定要在这里使用一个函数。 当您调用timer.changenumber() ,您正在告诉计时器更改其编号。 当你调用timer.emit('changenumber') ,你实质上就是代表定时器说数字已经改变了。 更糟的是,计时器正在与自己交谈。