Node.js 中的事件和事件发射器
Events & Event Emitter in Node.js
所以我附加了两个事件,如果有人尖叫,它们会被同步调用,为什么这样?
const events = require('events');
const eventEmitter = new events.EventEmitter();
eventEmitter.on('scream', function() {
console.log("Screaming");
});
eventEmitter.on('scream', function(name) {
console.log(name+" is screaming");
});
eventEmitter.emit('scream', 'Bob');
O/P:
尖叫
鲍勃在尖叫
因为Event loop从Event Queue中取出事件,一个一个发送到调用栈。
事件队列是FIFO(先进先出)
因为在 nodejs 中,事件循环是单线程的,一次选择一个事件并独立处理这些事件。
在您的例子中,有两个同名的事件处理程序,因此当事件循环获取 eventEmitter.emit('scream', 'Bob')
时,它会发送特定的事件处理程序。
当第一个事件处理程序完成时,现在它转到第二个处理程序,因为具有相同的名称。
它遵循 FIFO,但如果您使用 emitter.prependListener(eventName, listener)
,那么它将首先执行 FIFO。
你应该知道,如果你只想调用一次那么你应该使用eventEmitter.once('scream')
它只会被调用一次
eventEmitter.once('scream', function() {
console.log("Screaming");
});
eventEmitter.emit('scream', 'Bob');
eventEmitter.emit('scream', 'Bob');
eventEmitter.emit('scream', 'Bob');
Output: Screaming // Only one time.
所以我附加了两个事件,如果有人尖叫,它们会被同步调用,为什么这样?
const events = require('events');
const eventEmitter = new events.EventEmitter();
eventEmitter.on('scream', function() {
console.log("Screaming");
});
eventEmitter.on('scream', function(name) {
console.log(name+" is screaming");
});
eventEmitter.emit('scream', 'Bob');
O/P: 尖叫
鲍勃在尖叫
因为Event loop从Event Queue中取出事件,一个一个发送到调用栈。
事件队列是FIFO(先进先出)
因为在 nodejs 中,事件循环是单线程的,一次选择一个事件并独立处理这些事件。
在您的例子中,有两个同名的事件处理程序,因此当事件循环获取 eventEmitter.emit('scream', 'Bob')
时,它会发送特定的事件处理程序。
当第一个事件处理程序完成时,现在它转到第二个处理程序,因为具有相同的名称。
它遵循 FIFO,但如果您使用 emitter.prependListener(eventName, listener)
,那么它将首先执行 FIFO。
你应该知道,如果你只想调用一次那么你应该使用eventEmitter.once('scream')
它只会被调用一次
eventEmitter.once('scream', function() {
console.log("Screaming");
});
eventEmitter.emit('scream', 'Bob');
eventEmitter.emit('scream', 'Bob');
eventEmitter.emit('scream', 'Bob');
Output: Screaming // Only one time.