Feb 16, 2007

JavaScriptの関数の結果を期限付きでキャッシュする

処理に時間がかかるけれども、一定時間は結果が変わらないような関数の結果をキャッシュしたい。

例えばgetElementsByTagName("*")なんかを頻繁に呼び出すようなコードがあったとして、結果をキャッシュしたいけれど画面描画が発生すると使えなくなってしまう。setTimeoutで0ミリ秒後にキャッシュを消す処理を入れておいて、画面描画と関係のある処理はタイマーで実行するような制約を付けてコードを書けばDOMが絡む処理の結果もキャッシュすることができる。というようなケースに使えるような気がする。
Function.prototype.timed_memoise = function(ms){
    var self = this;
    ms = ms || 0;
    var memo = {};
    var clear_q = false;
    function clear_cache(){memo={};clear_q=false}
    return function(){
        var args = Array.prototype.slice.apply(arguments);
        if(!clear_q){
            setTimeout(clear_cache, ms);
            clear_q = true;
        }
        var key = "_" + args.join(',');
        return (key in memo) ? memo[key] : (memo[key] = self.apply(this,arguments));
    }
};
some_function = some_function.timed_memoise(expire);
Posted at 17:21 | WriteBacks (9) | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.