节点有什么事件顺序保证?

时间:2013-07-19 17:08:16

标签: node.js events

我在文档中看到,对于给定的事件,侦听器将被执行"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);
}

2 个答案:

答案 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(),因此最终这些事件也按照本机代码发送它们的顺序传递。