由于“秩序”的含义很广泛,让我解释一下我感兴趣的案例。
一个相当常见的模式(好的或坏的):
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”是整个同步顺序的一部分)。
问题是一般的事件发射器,而不是连接处理的工作方式,因为在其他地方也可以看到类似的模式-例如,相同的连接重用来处理不同的事务,并且需要在单个事务的持续时间内绑定error处理程序,但不能重叠处理程序,或者在事务继续进行后处理事件。
在EventEmitter中有这样的保证吗?否则,像上面这样的许多模式真的需要更具防御性的编码。
发布于 2016-04-30 22:58:30
没有一个EventEmitter方法会延迟到下一个滴答器或其他任何地方,它们都在被调用的时候完成所有的工作。
因此,执行client.removeAllListeners('error');操作将立即删除error事件的所有事件处理程序。
https://stackoverflow.com/questions/36956220
复制相似问题