2011-05-18 61 views
5

我在全局緩存變量中使用jQuery維護JavaScript中的緩存。在js中同步管理緩存

每當使用AJAX收到新信息時,它都會被添加到緩存中。

如果它不在緩存中,我想從服務器AJAX它。

我想實現一個功能,按需查詢和使用它像這樣:

$("#label").html(GetName("user123")); 

其中的GetName()應該是這樣的:

function GetName(username) { 
    if (Cache[username] != null) return Cache[username]; 
    else 
    return QueryUsernameFromServer(username) 
} 

QueryUsernameFromServer()應該是這樣的:

function QueryUsernameFromServer (username) { 
    return $.ajax(…); 
} 

但是,$ .ajax是異步的意思,它不能等待一個值(因此不能返回它)。

使用$就在同步模式強烈不推薦(瀏覽器掛起,它不支持JSONP),http://api.jquery.com/jQuery.ajax/

利用這一點,http://www.techfounder.net/2008/05/17/simple-javascript-cache/,方法需要回調。但是,不希望爲每次使用創建回調。

有沒有一種很好的方式來實現js和ajax中的「按需緩存」功能,而不需要每次使用專用的回調?

回答

5

您需要回調,因爲AJAX是......等待它......「A」同步。

只需將回調添加到查詢緩存的函數中即可。這很簡單:

function getName(username, callback){ 
    if(cache[username]){ 
    // cache hit, immediately invoke the callback 
    callback(cache[username]); 
    }else{ 
    // assumes this query function updates the cache and invokes the 
    // 2nd parameter when it completes 
    queryUsernameFromServer(username, function(){ 
     // invoke the callback now 
     callback(cache[username]); 
    }); 
    } 
} 

,簡單地轉換成異步風格在你的代碼:

前:

var name = getName('jvenema'); 

後:如果您使用jQuery

getName('jvenema', function(name){ 

}); 
+0

+1。這完全是我用於我們的數據提供者的工作。我喜歡有一個數據層,以便我們可以重用它並在一個位置更新所有'ajax'代碼(例如,當jQuery翻修其''ajax'命名空間時)。 – pixelbobby 2011-05-18 16:23:11

1

1.5+那麼你可以使用延期。

function GetName(username) { 
    if (Cache[username] != null) return $.when(Cache[username]); 
    else 
    return QueryUsernameFromServer(username) 
} 

而且使用deferreds良好的解決方案如下

GetName('jvenema').done(function(name) { 

});