forEach在javascript中不匹配

forEach在javascript中不匹配,javascript,Javascript,所以这应该是相对简单的。事实上,这应该是非常琐碎的。但是我正在处理如何处理这个问题,在下面的类中考虑下面的方法: trigger(name, ...args) { let returnValue = null; if (!this.events.length > 0) { throw Error('There are no registered events.'); } this.events.forEach((event) =>

所以这应该是相对简单的。事实上,这应该是非常琐碎的。但是我正在处理如何处理这个问题,在下面的类中考虑下面的方法:

  trigger(name, ...args) {
    let returnValue = null;

    if (!this.events.length > 0) {
      throw Error('There are no registered events.');
    }

    this.events.forEach((event) => {
      console.log(event.name, name)
      if (event.name === name) {
        if (args !== undefined) {
          returnValue = event.cb(...args, this);
        } else {
          returnValue = event.cb(this);
        }
      } else {
        throw Error('could not find ' + name + ' in the list of registered events.');
      }
    });

    return returnValue;
  }
直截了当,简单明了。错误如下:

console.log src/events/handler.js:51 event.with.params event.with.params

console.log src/events/handler.js:51 event.with.no.params event.with.params

如果注册了多个事件,则会出错。我认为最简单的解决方法是做一次回击;一旦名称匹配,正如您所看到的,它只匹配一次。测试结果如下:

  test('success in triggering multiple events', () => {
    eventHandler.register('event.with.params', (a, b) => {
      return a + ' ' + b;
    });

    eventHandler.register('event.with.no.params', () => {
      return 'no params'
    });

    expect(eventHandler.trigger('event.with.params', 'a', 'b')).toEqual('a b');
    expect(eventHandler.trigger('event.with.no.params')).toEqual('no params');
  });
在这里你可以看到我们注册了两个事件,然后我们尝试触发它们。测试中的错误为:

could not find event.with.params in the list of registered events.
    at Error (native)
Accept by console.log它确实找到了它。。。然后继续

我知道这是微不足道的修复,但我似乎无法解决它。帮助???

。forEach确实为每个人提供帮助。因此,如果你有任何不同名称的事件,它将抛出它

您可以先筛选事件

const filtered = this.events.filter(event => event.name === name);
然后检查是否有

if(!filtered.length) throw new Error(...)
然后跑

filtered.forEach(event => /* run handlers */)

ps:如果您使用…args,它将永远不会是未定义的,除非您的函数被称为triggersomeName,未定义-如果triggersomeName被调用,args将是[]。类似的注意事项是callback…[],这与callbackthis相同。如果为此事件注册了多个处理程序,您如何处理returnValue?此时,您将覆盖returnValue并从上次调用的回调返回值。看起来您的处理程序代码将抛出错误-如果事件中的第一项内容与名称不匹配-如果有任何事件注册为其他名称,谢谢@Thomas@naomik,args永远不会是虚假的。即使被称为triggersomeName,未定义的参数也将是[undefined]@thedude,如果有任何事件注册为其他名称,则不会抛出。