Ответ, данный @Bhojendra Rauniyar, верен, imho, но отсутствует рабочий пример, который приведен ниже.Обратите внимание, небольшое, но важное изменение, которое я сделал, чтобы определить функцию обратного вызова для setTimeout()
в student.js
: я использую функцию стрелки () =>
, которая связывает this
экземпляра студента с функцией обратного вызова.Это необходимо для вызова переменной экземпляра из функции обратного вызова.В качестве альтернативы можно использовать function () { ... }.bind(this)
.
index.js
const EventEmitter = require('events');
const Student = require('./student');
const eventEmitter = new EventEmitter();
async function start() {
eventEmitter.on('newListener', (event, listener) => {
console.log(`Added ${event} listener.`);
});
eventEmitter.on('handRaised', (question) => {
console.log(question);
});
for (let i=0; i<10; i++) {
let student = new Student(`Student #${i+1}`, eventEmitter);
student.attend();
}
}
start();
student.js
'use strict';
class Student {
constructor(name, eventEmitter) {
this.name = name;
this.eventEmitter = eventEmitter;
}
attend() {
// simulate a student randomly asking a question within 10 minutes
let minutes = (Math.floor(Math.random() * 10) + 1) * 60000;
setTimeout(() => {
this.eventEmitter.emit('handRaised', 'What is the 2 + 3?');
}, minutes);
}
}
module.exports = Student;