【问题标题】:caching objects in javascript在javascript中缓存对象
【发布时间】:2012-09-15 19:49:49
【问题描述】:

我对这段代码有意见:

javascript代码:

var cache = {};

cache.init = function()
{   
    if(typeof(this.memory)=='undefined')
        this.memory = {};
};

cache.set = function(key, value)
{
    this.memory[key] = value;
};

cache.get = function(key)
{
    if(console)
    {
        console.log("memory: ");
        console.log(cache.memory);

        console.log("key: "+key);
        console.log(cache.memory[key]);
    }

    if(typeof(cache.memory[key])!='undefined')
        return cache.memory[key];

    return false;
};

var route = {};

route.load = function(url)
{
    var route_list = cache.get('route_list');

    if(route_list==false)
    {
        route_list = this.getList();
        cache.set('route_list', route_list);
    }

    return route_list;
};

route.getList = function()
{
    var result = false;
    $.ajax(
    {
        url: 'route.json',
        dataType: 'json',
        async: false,
        success: function(json)
        {
            result = json;
        }
    });
    return result;
};

cache.init();
route.load();
route.load();

我想在客户端缓存一些对象,并设置和获取“缓存”。

route.json 文件内容:

{    
    "/example":
    {
        "controller":   "example"
    },
    "/example/show":
    {
        "controller":   "example",
        "method":   "show"
    }
}

萤火虫的结果是:

memory:
Object
{
route_list
    Object { /example={...}, /example/show={...}}
}
key: route_list
undefined

为什么是未定义的?我可以使用 firebug o.O 在对象内部导航

编辑:我添加了第二次调用 route.load();我得到未定义的键

【问题讨论】:

  • 向我们展示你如何使用 firebug - 我看不到任何日志语句
  • console.log 在 cache.get 中,这里是快照:i.imgur.com/VMSsp.png

标签: javascript json caching


【解决方案1】:

好的,现在我可以看到您的问题了。你的代码

route.load();
route.load();
  1. 尝试从缓存中获取 [uncached] 值:
    1. 这会记录内存对象
    2. 并记录undefined,因为什么都没有
  2. 因为它返回 false
    1. 同步获取 JSON
    2. 并将其设置在缓存中
  3. 再次尝试获取 [缓存] 值
    1. 记录内存对象
    2. 并记录缓存的对象

一切都正确执行。现在,您在控制台中看到内存对象两次 - 但它是同一个对象,在检查它时处于当前状态,而不是在您记录它时的状态。另请参阅

【讨论】:

    【解决方案2】:

    错误来自node.js:

        socket.emit('zapp_client', '/example');
        socket.emit('zapp_client', '/example/show');
    

    我认为它是异步的:

        socket.emit('zapp_client', '/example');
        setTimeout(function()
        {
            socket.emit('zapp_client', '/example/show');
        }, 1000);
    

    有了这个,我暂时解决了这个问题……

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 2020-07-11
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多