如何创建新的事件发射器并注册"open"和"close"事件侦听器?



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

例如,在执行以下代码后,它应该打印"已打开!",然后打印"关闭!":

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

谁能解释为什么错误的答案和例外?

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

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

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

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

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

使用 once((,侦听器将仅在第一次侦听事件。

根据您的解决方案和上面提出的建议,请在下面找到回答您查询的工作代码片段:

const EventEmitter = require("events"); //events.EventEmitter is just a self reference
function createEmitter(onOpen, onClose) {    
const myEmitter = new EventEmitter()
myEmitter.once('open', onOpen); 
myEmitter.once('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;

const EventEmitter = require("events");
function createEmitter(onOpen, onClose) {
const myEmitter = new EventEmitter() myEmitter.once('open', onOpen);
myEmitter.once('close', onClose);
return myEmitter;
}
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;
module.exports.createEmitter = createEmitter;
module.exports.opened = opened;
module.exports.closed = closed;

最新更新