我在文档中看到,对于给定的事件,侦听器将被执行"in order",但还有其他保证吗?例如,以下代码是保证按顺序打印0到9,还是只是当前实现的副作用?
var EventEmitter = require('events').EventEmitter
var ev = new EventEmitter();
ev.on("foo", console.log);
for (var i = 0; i < 10; i++) {
ev.emit("foo", i);
}
答案 0 :(得分:2)
听众将按照附加的顺序执行。
var EventEmitter = require('events').EventEmitter
var ev = new EventEmitter();
ev.on("foo", console.log);
ev.on("foo", function(i){ console.log('...'); });
for (var i = 0; i < 10; i++) {
ev.emit('foo', i);
}
将输出:
1
...
2
...
3
...
// and so on
但是将注册顺序更改为:
ev.on('foo', function(i) { console.log('...'); });
ev.on('foo', console.log);
输出将是:
...
1
...
2
...
3
// and so on
我相信你可以说,这与原始代码按顺序打印值这一事实无关。我不确定通过emit调用的侦听器是否在一个单独的线程上执行,而是由结果的外观执行,我猜这不是你看到顺序输出的原因。
答案 1 :(得分:2)
例如,以下代码保证按顺序打印0到9
嗯。我不认为它在任何地方的文档中都能得到保证,但这是事件队列可以工作的唯一合理方式。如果事件没有按发送顺序传递,则可能导致接收端出现非常纠结的逻辑。
正如在你的问题的一个评论中指出的那样,在全JavaScript的情况下,它不能以任何其他方式工作,因为事件是在emit()调用期间同步调度的。对于本机对象,类似的东西适用 - 他们需要通过V8绑定调用emit(),因此最终这些事件也按照本机代码发送它们的顺序传递。