Как создать новый EventEmitter и зарегистрировать открытые и закрытые прослушиватели событий?

Функция createEmitter должна создать новый EventEmitter и зарегистрировать открытые и закрытые прослушиватели событий. Обратные вызовы для этих событий должны быть аргументами onOpen и onClose соответственно. Открытый и закрытый методы должны вызывать события открытия и закрытия в EventEmitter, которые они получат в качестве аргументов эмиттера. Обратные вызовы должны вызываться только один раз для каждого эмиттера.

Например, после выполнения следующего кода он должен вывести Opened! а затем Закрыто!:

let emitter = createEmitter(
  () => console.log("Opened!"), () => console.log("Closed!")
);
opened(emitter);
closed(emitter);

Мой код:

const events = require("events");
const myEmitter = new events.EventEmitter();

function createEmitter(onOpen, onClose) {    
myEmitter.on('open', onOpen); 
myEmitter.on('close', onClose);
}

function opened(emitter) {
myEmitter.emit('open', emitter); 

}
function closed(emitter) {
myEmitter.emit('close', emitter);
}

let emitter = createEmitter(
  () => console.log("Opened!"), () => console.log("Closed!")
);
opened(emitter);
closed(emitter);

module.exports.createEmitter = createEmitter;
module.exports.opened = opened;
module.exports.closed = closed;

Выход:

Opened!
Closed!

Тестовые случаи:

  OK: Example case: Correct answer 
  WRONG: createEmitter registers the correct events: Exception 
  OK: open and close functions raise the correct events: Correct answer 
  WRONG: Callbacks are only invoked once: Wrong answer

Может ли кто-нибудь объяснить, почему неправильный ответ и исключение?


person Nafeo Joy    schedule 01.07.2020    source источник
comment
Результаты вашего теста не совпадают с операторами журнала консоли в вашем коде, вы каким-то образом опубликовали неправильные результаты? Может быть, вы используете неправильный скрипт?   -  person loganfsmyth    schedule 01.07.2020
comment
Я отредактировал свой вопрос. Мой вывод дает мне желаемый результат, однако тестовые случаи дают мне 2 НЕПРАВИЛЬНО (неправильный ответ и исключение)   -  person Nafeo Joy    schedule 01.07.2020
comment
Что такое коды тестовых случаев?   -  person acdcjunior    schedule 01.07.2020
comment
Тестовые случаи, которые я не смог пройти: 1. Методы Open и Close должны генерировать события open и close в EventEmitter, которые они получат в качестве аргументов эмиттера. 2. Обратные вызовы должны вызываться только один раз для каждого эмиттера. @acdcjunior   -  person Nafeo Joy    schedule 01.07.2020
comment
У вас есть код для этих тестов?   -  person acdcjunior    schedule 01.07.2020
comment
к сожалению нет!   -  person Nafeo Joy    schedule 02.07.2020


Ответы (3)


Замените .on() на Once(). Использование Once() удаляет прослушиватели событий, когда событие обрабатывается той же функцией.

person Kaperskyguru    schedule 17.09.2020

Я предполагаю, что проблема в том, что ваша функция createEmitter не создает эмиттер, а добавляет события в заранее созданный. Попробуйте это так:

const EventEmitter = require("events"); //events.EventEmitter is just a self reference

function createEmitter(onOpen, onClose) {    
  const myEmitter = new EventEmitter()
  myEmitter.on('open', onOpen); 
  myEmitter.on('close', onClose);
  return myEmitter; //This is important
}

function opened(emitter) {
  emitter.emit('open'); 
}
function closed(emitter) {
  emitter.emit('close');
}

let emitter = createEmitter(
  () => console.log("Opened!"), () => console.log("Closed!")
);
opened(emitter);
closed(emitter);

module.exports.createEmitter = createEmitter;
module.exports.opened = opened;
module.exports.closed = closed;
person FZs    schedule 07.07.2020
comment
Это лучший подход. Открытый и закрытый методы должны генерировать события открытия и закрытия в EventEmitter, которые они получат, поскольку аргументы эмиттера являются ПРАВИЛЬНЫМИ. Однако «обратные вызовы не вызываются один раз» - person Nafeo Joy; 07.07.2020
comment
@nafeo Каковы точные требования? - person FZs; 07.07.2020

Одним из требований было то, что обратные вызовы должны вызываться только один раз для каждого эмиттера.

Поэтому при регистрации события нужно использовать функцию Once(), а не on();

myEmitter.once('open', onOpen); 
myEmitter.once('close', onClose);

Используя Once(), слушатель будет прослушивать событие только в первый раз.

person German P.    schedule 30.01.2021