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.