如何创建一个新的EventEmitter并注册“打开”和“关闭”事件侦听器?

时间:2020-07-01 15:34:25

标签: javascript node.js events ecmascript-6 eventemitter

createEmitter函数应创建一个新的EventEmitter并注册“打开”和“关闭”事件侦听器。这些事件的回调应分别为onOpen和onClose参数。打开和关闭方法应在将作为发射器参数接收的EventEmitter上引发“ open”和“ close”事件。每个发射器仅应调用一次回调。

例如,执行以下代码后,它应打印“ 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

任何人都可以解释为什么错误答案和例外吗?

3 个答案:

答案 0 :(得分:1)

我认为问题是您的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;

答案 1 :(得分:1)

用一次()替换.on()。当事件由同一函数处理时,使用一次()会删除事件侦听器。

答案 2 :(得分:0)

其中一项要求是“每个发射器只能调用一次回调”。

因此注册事件时应该通过函数 once() 而不是 on();

document.activeElement.blur()

使用 once() 监听器只会在第一次监听事件。

相关问题