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

我在文档中看到,听众将按“按顺序”执行某个特定事件,但还有其他什么保证? 例如,下面的代码是保证按顺序打印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); } 

听众将按照他们所附的顺序执行。

 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 

正如我可以肯定的那样,这与原始代码依次打印值无关。 我不知道是否通过发射调用监听器是否在一个单独的线程上执行,但通过你的结果的外观,我不会猜测这是为什么你看到的顺序输出。

例如,下面的代码保证按顺序打印0到9

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

正如在你的问题的一个注释中指出的那样,在所有的JavaScript情况下,它不能以任何其他方式工作,因为事件在emit()调用期间是同步分派的。 对于本地对象,类似的东西适用 – 他们需要通过V8绑定调用emit(),所以最终这些事件按照本地代码发送的顺序传递。