在我不期望的时候得到不确定的

时间:2017-04-11 22:24:49

标签: javascript ecmascript-6

如果您查看以下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'

思想吗

2 个答案:

答案 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;
}