基本的にサイトのデータをポーリングし、一致したときに消費者に通知する小さなライブラリを作成しています。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);