由于“订单”的含义很广泛,让我解释一下我感兴趣的案例。
一种相当常见的模式(好的或坏的):
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
有这样的保证吗?否则,像上面这样的许多模式确实需要在防御性方面进行编码。
答案 0 :(得分:0)
EventEmitter
方法都没有推迟到下一个刻度或其他任何方法,它们都会在被调用时完成所有工作。
这样做client.removeAllListeners('error');
会立即删除error
事件的所有事件处理程序。