Событие Node.js EventEmitter `on` не отвечает на действия` emit` - PullRequest
1 голос
/ 16 марта 2019

У меня есть приложение Node.js, которое представляет классную комнату.Я использую Node версии 11.11.0.Это приложение имеет два файла: index.js и student.js.Соответствующий код выглядит следующим образом:

index.js

const EventEmitter = require('events');
const Student = require('./student');

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}`);
    student.attend();
  }
}

start();

student.js

'use strict';

const EventEmitter = require('events');

class Student {
  constructor(name) {
    this.name = name;
  }

  attend() {
    // simulate a student randomly asking a question within 10 minutes
    let minutes = (Math.floor(Math.random() * 10) + 1) * 60000;
    setTimeout(function() {
      EventEmitter.emit('handRaised', 'What is the 2 + 3?');
    }, minutes);
  }
}

module.exports = Student;

КогдаЯ запускаю это, я получаю сообщение об ошибке EventEmitter.emit is not a function.Я попробовал несколько вариантов без удачи.Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Вы не можете использовать emit на EventEmitter напрямую.Вам нужно иметь экземпляр этого.Например ::1003 *

const eventEmitter = new EventEmitter();
// Now, you're okay to go with emit
eventEmitter.emit('handRaised', 'What is the 2 + 3?');

Чтобы использовать тот же экземпляр, определите его в файле и требуйте везде, где он вам нужен.Тогда вы можете безопасно использовать on и emit.

0 голосов
/ 16 марта 2019

Ответ, данный @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;
...