簡體   English   中英

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循環從事件隊列中提取事件並將它們逐個發送到調用堆棧。

事件隊列是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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM