如何在对象而不是元素

时间:2016-06-22 06:53:16

标签: javascript events delegates multicastdelegate

我正在编写一个小型库,它基本上会轮询网站的数据,然后应该在匹配时通知消费者。在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);

0 个答案:

没有答案