2

私はこのコードでポルターガイストを持っています:

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"
    }
}

そしてfirebugの結果は次のとおりです。

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

なぜ未定義ですか?firebug oO でオブジェクト内をナビゲートできます

編集: route.load(); の 2 番目の呼び出しを追加しました。未定義のキーを取得する

4

2 に答える 2

1

OK、これで問題がわかりました。あなたのコード

route.load();
route.load();
  1. キャッシュから [uncached] 値を取得しようとします:
    1. これはメモリオブジェクトを記録します
    2. undefined何もないのでログに記録します
  2. false を返すため
    1. JSON を同期的に取得する
    2. そしてそれをキャッシュに設定します
  3. [キャッシュされた]値を再度取得しようとします
    1. メモリ オブジェクトをログに記録します
    2. キャッシュされたオブジェクトをログに記録します

すべてが正しく実行されます。ここで、メモリ オブジェクトがコンソールに 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 に答える