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
任何人都可以解释为什么错误答案和例外吗?
答案 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() 监听器只会在第一次监听事件。