Node.js
Излучатели событий
Поиск…
замечания
Когда событие «срабатывает» (что означает то же самое, что «публикация события» или «излучение события»), каждый слушатель будет называться синхронно ( источник ) вместе с любыми сопроводительными данными, которые были переданы в emit()
, no сколько аргументов вы передадите:
myDog.on('bark', (howLoud, howLong, howIntense) => { // handle the event }) myDog.emit('bark', 'loudly', '5 seconds long', 'fiercely')
Слушатели будут вызваны в том порядке, в котором они были зарегистрированы:
myDog.on('urinate', () => console.log('My first thought was "Oh-no"')) myDog.on('urinate', () => console.log('My second thought was "Not my lawn :)"')) myDog.emit('urinate') // The console.logs will happen in the right order because they were registered in that order.
Но если вам нужно сначала прослушивать, прежде чем все остальные слушатели уже добавлены, вы можете использовать prependListener()
следующим образом:
myDog.prependListener('urinate', () => console.log('This happens before my first and second thoughts, even though it was registered after them'))
Если вам нужно прослушать событие, но вы хотите только один раз услышать об этом, вы можете использовать once
вместо on
или prependOnceListener
вместо prependListener
. После того, как событие будет запущено, а слушатель будет вызван, слушатель автоматически будет удален и не будет вызываться снова при следующем запуске события.
Наконец, если вы хотите удалить всех слушателей и начать все сначала, не стесняйтесь делать это:
myDog.removeAllListeners()
HTTP-аналитика через событие-эмитент
В коде сервера HTTP (например, server.js
):
const EventEmitter = require('events')
const serverEvents = new EventEmitter()
// Set up an HTTP server
const http = require('http')
const httpServer = http.createServer((request, response) => {
// Handler the request...
// Then emit an event about what happened
serverEvents.emit('request', request.method, request.url)
});
// Expose the event emitter
module.exports = serverEvents
В коде супервизора (например, supervisor.js
):
const server = require('./server.js')
// Since the server exported an event emitter, we can listen to it for changes:
server.on('request', (method, url) => {
console.log(`Got a request: ${method} ${url}`)
})
Всякий раз, когда сервер получает запрос, он выдает событие, называемое request
который прослушивает супервизор, а затем супервизор может реагировать на событие.
основы
Излучатели событий встроены в узел и предназначены для pub-sub, где издатель будет генерировать события, на которые могут слушать и реагировать абоненты . В узле jargon издатели называются Event Emitters , и они излучают события, а абоненты называются слушателями , и они реагируют на события.
// Require events to start using them const EventEmitter = require('events').EventEmitter; // Dogs have events to publish, or emit class Dog extends EventEmitter {}; class Food {}; let myDog = new Dog(); // When myDog is chewing, run the following function myDog.on('chew', (item) => { if (item instanceof Food) { console.log('Good dog'); } else { console.log(`Time to buy another ${item}`); } }); myDog.emit('chew', 'shoe'); // Will result in console.log('Time to buy another shoe') const bacon = new Food(); myDog.emit('chew', bacon); // Will result in console.log('Good dog')
В приведенном выше примере собака является издателем / EventEmitter, а функцией, которая проверяет элемент, является абонент / слушатель. Вы также можете сделать больше слушателей:
myDog.on('bark', () => { console.log('WHO\'S AT THE DOOR?'); // Panic });
Также могут быть несколько слушателей для одного события и даже удалить прослушиватели:
myDog.on('chew', takeADeepBreathe); myDog.on('chew', calmDown); // Undo the previous line with the next one: myDog.removeListener('chew', calmDown);
Если вы хотите прослушивать событие только один раз, вы можете использовать:
myDog.once('chew', pet);
Который автоматически удалит слушателя без условий гонки.
Получите имена событий, на которые подписаны
Функция EventEmitter.eventNames () вернет массив, содержащий имена зарегистрированных в настоящее время событий.
const EventEmitter = require("events");
class MyEmitter extends EventEmitter{}
var emitter = new MyEmitter();
emitter
.on("message", function(){ //listen for message event
console.log("a message was emitted!");
})
.on("message", function(){ //listen for message event
console.log("this is not the right message");
})
.on("data", function(){ //listen for data event
console.log("a data just occured!!");
});
console.log(emitter.eventNames()); //=> ["message","data"]
emitter.removeAllListeners("data");//=> removeAllListeners to data event
console.log(emitter.eventNames()); //=> ["message"]
Получите количество зарегистрированных слушателей для прослушивания определенного события
Функция Emitter.listenerCount (eventName) вернет количество слушателей, которые в настоящее время прослушивают событие, предоставленное в качестве аргумента
const EventEmitter = require("events");
class MyEmitter extends EventEmitter{}
var emitter = new MyEmitter();
emitter
.on("data", ()=>{ // add listener for data event
console.log("data event emitter");
});
console.log(emitter.listenerCount("data")) // => 1
console.log(emitter.listenerCount("message")) // => 0
emitter.on("message", function mListener(){ //add listener for message event
console.log("message event emitted");
});
console.log(emitter.listenerCount("data")) // => 1
console.log(emitter.listenerCount("message")) // => 1
emitter.once("data", (stuff)=>{ //add another listener for data event
console.log(`Tell me my ${stuff}`);
})
console.log(emitter.listenerCount("data")) // => 2
console.log(emitter.listenerCount("message"))// => 1