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,如果有任何事件注册为其他名称,则不会抛出。