我什么时候应该使用EventEmitter?

Zag*_*ine 9 javascript node.js eventemitter

我读了很多关于的事情EventEmitter.但我不知道在哪种情况下我需要在我的Node.js应用程序中使用它.

小智 24

每当代码对某些东西进行SUBSCRIBE而不是从某些东西获得回调时是有意义的.典型的用例是应用程序中存在多个代码块,可能需要在事件发生时执行某些操作.

例如,假设您正在创建一个票务系统.处理事情的常用方法可能是这样的:

function addTicket(ticket, callback) {
    insertTicketIntoDatabase(ticket, function(err) {
        if (err)
            return handleError(err);

        callback();
    });
}
Run Code Online (Sandbox Code Playgroud)

但是现在,有人决定在将数据库插入数据库时​​,您应该通过电子邮件发送给用户,让他们知道.没关系,你可以把它添加到回调中:

function addTicket(ticket, callback) {
    insertTicketIntoDatabase(ticket, function(err) {
        if (err)
            return handleError(err);

        emailUser(ticket, callback);
    });
}
Run Code Online (Sandbox Code Playgroud)

但现在,有人还希望通知另一个系统已插入故障单.随着时间的推移,插入故障单时可能会发生任何事情.所以让我们改变一下:

function addTicket(ticket, callback) {
    insertTicketIntoDatabase(ticket, function(err) {
        if (err)
            return handleError(err);

        TicketEvent.emit('inserted', ticket);
        callback();
    });
}
Run Code Online (Sandbox Code Playgroud)

在通知用户界面之前,我们不再需要等待所有这些功能完成.在代码的其他地方,您可以轻松添加这些功能:

TicketEvent.on('inserted', function(ticket) {
    emailUser(ticket);
});

TicketEvent.on('inserted', function(ticket) {
    notifySlack(ticket);
});
Run Code Online (Sandbox Code Playgroud)

  • 当您可以将所有事件都放在一个侦听器中时,为什么还要侦听同一事件呢? (2认同)

Yil*_*maz 6

  • 当同一事件可能发生多次或可能根本不发生时,应使用 EventEmitter。事实上,无论操作成功与否,回调都应该被调用一次。回拨意味着当你准备好时给我打电话

  • 使用回调的 API 只能通知一个特定的回调,而使用 EventEmitter 则允许我们为同一事件注册多个侦听器。

  • 如果需要通知用户状态更改,请使用事件发射器。

  • 出于测试目的,如果您想确保在函数内部调用函数,请发出一个事件。