サードパーティのサービス (Facebook、Twitter など) に対して定期的にデータをポーリングする Web アプリがあります。このポーリング/リクエストは JSONP 経由で行われます (クロスドメインの問題を回避するため)。
たとえば、単純なリクエストは次のようになります。
function jsonp_callback() {
// Do something
}
var url = 'http://some.service.com/getresult?callback=jsonp_callback';
$http.jsonp(url);
ただし、任意の時点で作成できる別の種類の要求 (更新の送信または投稿など) が存在する可能性があるため、コールバックを処理するラッパーを作成しました。
実装は次のようなものです。
// Callback handler
var myCb = (function() {
var F = function() {};
F.prototype.fn = {};
F.prototype.create = function(fn, scope) {
var self = this;
var id = new Date().getTime();
self.fn[id] = function() {
if (typeof fn === 'function') {
fn.call(scope);
}
}
return 'myCb.fn.' + id;
}
return new F();
})();
// JSONP request
var cb = myCb.create(function() {
// Do something
});
var url = 'http://some.service.com/getresult?callback=' + cb;
$http.jsonp(url);
しばらくすると、myCb.fnが古いコールバックまたは既に実行されたコールバックによって肥大化することに気付きます。Mu の質問は、実行されて不要になった人をガベージ コレクションするメカニズムを作成する必要があるかどうかです。