Node.js Событие EventEmitter `on` не может" видеть "свойство класса - PullRequest
2 голосов
/ 19 марта 2019

Это продолжение моего предыдущего SO вопроса . В этом вопросе я определил файл index.js, который включает обработчик событий on. С тех пор я обновил файл index.js, чтобы он выглядел так:

index.js

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

class Classroom {
  constructor() {
    this.whiteboard = new Whiteboard();
  }

  async function start() {
    eventEmitter.on('newListener', (event, listener) => {
      console.log(`Added ${event} listener.`);
    });

    eventEmitter.on('handRaised', (question) => {
      console.log(question);
      this.whiteboard.write(question);
    });

    for (let i=0; i<10; i++) {
      let student = new Student(`Student #${i+1}`);
      student.attend();
    }
  }
}

Когда я запускаю свое приложение, строка с this.whiteboard.write(question); генерирует ошибку. Эта ошибка: Cannot read property 'write' of undefined. Я подтвердил, что this.whiteboard не определено. У меня вопрос, как мне получить доступ к свойствам класса в событиях?

Спасибо!

Ответы [ 2 ]

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

Не должно быть проблем с использованием this.whiteboard, но ваше определение класса странное, на самом деле я бы ожидал SyntaxError от определения метода.

Попробуйте изменить код следующим образом:

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

const eventEmitter = new EventEmitter(); /* create an emitter instance */

class Classroom {
  constructor() {
    this.whiteboard = new Whiteboard();
  }

  async start() { /* no 'function' here */
    eventEmitter.on('newListener', (event, listener) => {
      console.log(`Added ${event} listener.`);
    });

    eventEmitter.on('handRaised', (question) => {
      console.log(question);
      this.whiteboard.write(question);
    });

    for (let i=0; i<10; i++) {
      let student = new Student(`Student #${i+1}`);
      student.attend();
    }
  }
}

РЕДАКТИРОВАТЬ: экземпляр EventEmitter

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

При обратном вызове любого события ваш this никогда не указывает на ваш класс.попробуйте это.

var self = this;
eventEmitter.on('handRaised', (question) => {
  console.log(question);
  self.whiteboard.write(question);
});
...