我正在编写一个小型库,它基本上会轮询网站的数据,然后应该在匹配时通知消费者。在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将在页面上可用,如果这样可以使事情变得更容易。
作为参考,这是我过去使用的多播代理实现:
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);