Node.js - 发出vs函数调用

时间:2014-07-22 19:55:12

标签: javascript node.js

我一直在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,并且已经看到它基本上发出并监听客户端和服务器端的同一个对象,所以也许这就是我感到困惑的地方。

是否有任何情况下使用一种方法可能比另一种方法更合适?

1 个答案:

答案 0 :(得分:1)

一些注释可能会让人感到困惑:

  • 事件发生时会发生事件。 (例如,error已发生,data可用)

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

在你的函数示例changenumber中,你肯定应该在这里使用一个函数。当您拨打timer.changenumber()时,您告诉计时器更改其号码。当您致电timer.emit('changenumber')时,您实际上代表计时器发言,该号码已经更改。更糟糕的是,计时器正在与自己说话。