J'ai une application Node.js qui représente une salle de classe. J'utilise Node version 11.11.0. Cette application contient deux fichiers : index.js et student.js. Le code correspondant ressemble à ceci :

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();

étudiant.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;

Lorsque je lance ceci, j'obtiens une erreur qui dit EventEmitter.emit is not a function. J'ai essayé plusieurs variantes sans succès. Qu'est-ce que je fais mal?

1
Some User 16 mars 2019 à 15:14

2 réponses

Meilleure réponse

La réponse donnée par @Bhojendra Rauniyar est correcte, à mon humble avis, mais il manque un exemple fonctionnel qui est donné ci-dessous. Remarque, un changement subtil mais important que j'ai apporté pour définir la fonction de rappel pour setTimeout() dans student.js : j'utilise la fonction flèche () => qui lie this de l'instance de l'étudiant à la fonction de rappel. Ceci est nécessaire pour appeler la variable d'instance à partir de la fonction de rappel. Alternativement, function () { ... }.bind(this) peut être utilisé.

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();

étudiant.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;
0
Marcus 16 mars 2019 à 13:14

Vous ne pouvez pas utiliser emit sur EventEmitter directement. Vous devez en avoir une instance. Par exemple :

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

Pour utiliser la même instance, définissez-la dans un fichier et exigez où vous en aurez besoin. Ensuite, vous pouvez utiliser on et emit dessus en toute sécurité.

3
Bhojendra Rauniyar 16 mars 2019 à 12:34