我正在编写一个小型库,该库本质上是轮询站点以获取数据,然后应该在匹配时通知消费者。在 C# 中,我会使用事件,它们实际上是多播委托。我之前用 javascript 编写了自己的多播委托,但我认为必须有更好的方法。
消费者应注册一个回调,该回调应在数据可用时调用。像这样的东西:
window.MyLibrary.dataAvailable(function(data) {
// do something with data
});
在后台MyLibrary
轮询数据。当它最终有匹配的东西时,它应该执行注册的函数。多个功能应该能够注册并且可能也可以取消注册。
CustomEvent非常接近我想要的。问题CustomEvent
在于事件必须在元素上引发 - 它不能在对象上引发。也就是说,这是行不通的:
var event = new CustomEvent('dataAvailable', { data: 'dynamic data' });
window.MyLibrary.addEventListener('dataAvailable', function (e) {
// do something with e.data
}, false);
// From somewhere within MyLibrary
this.dispatchEvent(event, data);
你如何在javascript中的对象上注册处理程序?我需要支持常用的浏览器和 IE11+。理想情况下,我不会拉图书馆来做任何这些。jQuery 将在页面上可用,如果这会使事情变得更容易,可以使用它。
作为参考,这是我过去使用的 Multicast Delegate 实现:
function MulticastDelegate(context) {
var obj = context || window,
handlers = [];
this.event = {
subscribe: function (handler) {
if (typeof (handler) === 'function') {
handlers.push(handler);
}
},
unsubscribe: function (handler) {
if (typeof (handler) === 'function') {
handlers.splice(handlers.indexOf(handler), 1);
}
}
};
this.execute = function () {
var args = Array.prototype.slice.call(arguments);
for (var i = 0; i < handlers.length; i++) {
handlers[i].apply(obj, args);
}
};
}
var myEvent = new MulticastDelegate();
myEvent.event.subscribe(function(data) { ... }); // handler 1
myEvent.event.subscribe(function(data) { ... }); // handler 2
myEvent.execute(some_data);