Node.js中的事件与事件发射器

时间:2018-07-24 05:14:03

标签: node.js eventemitter

因此,如果有人尖叫,我会附加两个事件,它们被同步调用,为什么呢?

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: 尖叫

鲍勃在尖叫

2 个答案:

答案 0 :(得分:1)

因为Event loop从事件队列中获取事件,并将其逐个发送到调用堆栈。

事件队列是FIFO(先进先出)

答案 1 :(得分:1)

由于在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.