什么事件顺序保证做节点?
我在文档中看到,听众将按“按顺序”执行某个特定事件,但还有其他什么保证? 例如,下面的代码是保证按顺序打印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(),所以最终这些事件按照本地代码发送的顺序传递。