0

我正在编写一个小型库,该库本质上是轮询站点以获取数据,然后应该在匹配时通知消费者。在 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);
4

0 回答 0