1

我在文档中看到,对于给定事件,侦听器将“按顺序”执行,但还有哪些其他保证?例如,以下代码是否保证顺序打印 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);
}
4

2 回答 2

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 调用的侦听器是否在单独的线程上执行,但从你的结果来看,我猜这不是你看到顺序输出的原因。

于 2013-07-19T17:10:18.137 回答
2

例如,以下代码是否保证按顺序打印 0 到 9

唔。我认为它实际上并没有在任何地方的文档中得到保证,但这是事件队列可以工作的唯一合理方式。如果事件没有按照发送的顺序传递,可能会导致接收端的逻辑非常混乱。

正如对您的问题的评论之一所指出的那样,在全 JavaScript 的情况下,它不能以任何其他方式工作,因为事件是在 emit() 调用期间同步调度的。对于原生对象,类似的情况也适用——它们需要通过 V8 绑定调用 emit(),因此最终这些事件也会按照原生代码发送它们的顺序传递。

于 2013-07-19T17:35:35.647 回答