2

我有这个代码的 poltergeist:

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 oO 在对象内部导航

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

4

2 回答 2

1

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

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

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

于 2012-09-24T11:49:13.317 回答
0

错误来自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);

有了这个我暂时解决了这个问题......

于 2012-09-24T11:51:52.800 回答