在js中同步管理缓存

时间:2011-05-18 15:48:05

标签: javascript jquery ajax caching

我在全局缓存变量中使用jquery在JavaScript中维护缓存。

每当使用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是异步的,意味着它不能等待一个值(因此无法返回它)。

强烈建议不要在同步模式下使用$ .ajax(浏览器挂起且不支持JSONP),http://api.jquery.com/jQuery.ajax/

使用此http://www.techfounder.net/2008/05/17/simple-javascript-cache/方法需要回调。但是,不希望为每次使用创建回调。

是否有一种很好的方法可以在js和ajax中实现“按需缓存”功能而无需每次使用专用回调?

2 个答案:

答案 0 :(得分: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');

后:

getName('jvenema', function(name){

});

答案 1 :(得分:1)

如果您使用jQuery 1.5+,那么您可以使用延迟。

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

并使用deferreds如下

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

});
相关问题