如果您查看以下fiddle,您会看到我创建了一个名为EventHandler
的类,然后我将其用作以下内容(并在小提琴中):
/**
* Event Handler Class
*/
class EventHandler {
/**
* Core constructor.
*/
constructor() {
this.events = [];
this.beforeEvents = [];
this.afterEvents = [];
}
/**
* Register an event.
*
* @param {string} name
* @param {cb} callback
*/
register(name, cb) {
const event = {
name: name,
cb: cb
}
this.events.push(event);
}
/**
* Trigger an event based on name.
*
* @param {string} name
* @return {various}
*/
trigger(name) {
this.events.forEach((event) => {
if (event.name === name) {
return event.cb();
}
})
}
/**
* Get only the events.
*
* @return {array} events
*/
getEvents() {
return this.events;
}
}
const eventHandler = new EventHandler();
eventHandler.register('hello.world', () => {
return 'hello world';
});
alert(eventHandler.trigger('hello.world'));
当你操作小提琴时,你会得到undefined
,我希望看到'hello world'
。
思想吗
答案 0 :(得分:3)
在trigger
函数中,您将返回undefined。从forEach
回调内部返回不会返回父函数。
尝试将代码更改为以下内容:
trigger(name) {
let msg = '';
this.events.forEach((event) => {
if (event.name === name) {
msg = event.cb();
}
});
return msg;
}
答案 1 :(得分:0)
问题是你alert
eventHandler.trigger
的回复实际上没有返回任何内容,因此是undefined
。您可以使用Array.prototype.find
之类的内容来查找您的事件,然后像这样返回回调响应:
trigger(name) {
let event = this.events.find(e => e.name === name);
if (event)
return e.cb();
return null;
}
更好的方法是存储密钥=>价值对事件和回调,这样你就不必找到,你可以做一些像:
trigger(event) {
return this.events[event] ? this.events[event]() : null;
}