[英]JS How to check if callback is exist?
我有一系列已注册的回调
this.events[eventName].push({callback: callback});
问题在于,与数组中的用户操作相比,可以添加相同的calback,这已经存在。
如何检查回调是否存在?
如果从两个代码位注册两个相同的回调,将会发生什么? 它们应该被执行是合乎逻辑的。 问题是,如何不从同一个地方重新注册回叫。
适合这种情况的数据结构是ES6 Map
。 如果您使用它而不是数组,它将自动只存储唯一的:
this.events = new Map(); // one time initialisation instead of `this.events = []`;
// ...
this.events[eventName].set(callback, {callback: callback});
并按如下方式执行事件的回调:
this.events[eventName].forEach(({callback}) => callback());
如果回调是您存储的唯一内容,那么您可以使用Set
代替:
this.events = new Set();
// ...
this.events[eventName].add(callback);
并按如下方式执行事件的回调:
this.events[eventName].forEach(callback => callback());
您可以使用Array.prototype.some()
来测试回调是否已存在:
if (!this.events[eventName].some(function(el) {
return el.callback == callback;
}) {
this.events[eventName].push({callback: callback});
}
用一个简单的循环?
for (var i = 0; i < this.events[eventName].length; i++)
if (this.events[eventName].callback === callback)
return; // already exists, so return without pushing
this.events[eventName].push({callback: callback});
您可以使用Array.prototype.some
函数来检查是否存在回调
class Observer { constructor(){ this.events = {}; } on(name, callback){ if(typeof name !== 'string' || typeof callback !== 'function') return this; let ary = this.events[name] || (this.events[name] = []); if(ary.some(obj => obj.callback === callback)) return this; ary.push({callback}); return this; } } let observer = new Observer(); function testHandler(){} observer.on('test', testHandler) .on('test', testHandler); console.log(observer.events);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.