3

サードパーティのサービス (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 の質問は、実行されて不要になった人をガベージ コレクションするメカニズムを作成する必要があるかどうかです。

4

1 に答える 1

4

ページごとに少数の呼び出ししか行わない場合は、必ずしも古いコールバックを削除する必要はありませんが、ページが長時間実行され、繰り返し呼び出しを行う場合は、古いコールバックを削除することをお勧めします。

「メカニズム」は次のように単純です。

delete self.fn[id];

関数を呼び出した後。

于 2012-12-31T14:13:07.657 に答える