EventEmitter订购活动

时间:2016-04-30 14:39:55

标签: javascript node.js

由于“订单”的含义很广泛,让我解释一下我感兴趣的案例。

一种相当常见的模式(好的或坏的):

client = net.connect(...)
client.on('connect', () => {
  client.removeAllListeners('error');
  client.on('error', err => {
    ... // process IO errors
  });
  ...
});
client.on('error', err => {
  ... // process connection failures
});

我理解它的方式有效,可能会发出connect事件,稍后会发出IO error。但在EventEmitter级别是否有保证处理事件就像一个障碍(在适当的并发编程语音中)。

例如,在这种情况下,我希望保证connect处理程序仅删除为连接错误设置的error处理程序,并且仅为IO错误设置新的处理程序。但是,新事件监听器列表是否仅在下一个时间段内被考虑?我想确保程序顺序中的相互排除的处理程序(并发编程语音:“removeAllListeners”和“on('error')”按顺序执行,因此两个处理程序都不可能接收相同的事件)也是以同步顺序相互排除(并发编程语音:事件“connect”,“removeAllListeners”,“on(error)”和“IO error”是整个同步顺序的一部分)。

问题是关于事件发射器,而不是连接处理的工作原理,因为在其他地方可以看到类似的模式 - 例如,重复使用相同的连接来处理不同的事务,并且需要绑定{{1处理单个事务的持续时间,但不能重叠处理程序,或在事务移动后处理事件。

error有这样的保证吗?否则,像上面这样的许多模式确实需要在防御性方面进行编码。

1 个答案:

答案 0 :(得分:0)

EventEmitter方法都没有推迟到下一个刻度或其他任何方法,它们都会在被调用时完成所有工作。

这样做client.removeAllListeners('error');会立即删除error事件的所有事件处理程序。