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

Naf*_*Joy 1 javascript events node.js eventemitter ecmascript-6

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

例如,执行以下代码后,应该打印“Opened!” 然后“关闭!”:

let emitter = createEmitter(
  () => console.log("Opened!"), () => console.log("Closed!")
);
opened(emitter);
closed(emitter);
Run Code Online (Sandbox Code Playgroud)

我的代码:

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;
Run Code Online (Sandbox Code Playgroud)

输出:

Opened!
Closed!
Run Code Online (Sandbox Code Playgroud)

测试用例:

  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
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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