在js中同步管理缓存

发布于 2024-11-08 17:24:35 字数 981 浏览 0 评论 0原文

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

每当使用 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中实现“按需缓存”功能,而无需每次使用都有专门的回调?

I'm maintaining a cache in JavaScript using jquery in a global cache variable.

Whenever new information is received using AJAX it is added to the cache.

If it is not in the cache, I want to AJAX it from the server.

I want to implement a function to query on demand and to use it like so:

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

Where GetName() should be like:

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

QueryUsernameFromServer() should be like:

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

However, $.ajax is async meaning that it cannot wait for a value (and thus cannot return it).

Using $.ajax in sync mode is highly not recommended (browser hangs and it doesn’t support JSONP), http://api.jquery.com/jQuery.ajax/

Using this, http://www.techfounder.net/2008/05/17/simple-javascript-cache/, approach requires a callback. However, creating a callback for each use is not desired.

Is there a good way to implement a “cache on demand” function in js and ajax without a dedicated callback for each use?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鹤仙姿 2024-11-15 17:24:35

您需要回调,因为 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){

});

You'll need to have the callback, because AJAX is...wait for it..."A"synchronous.

Just add a callback to your functions that query the cache. It's pretty simple:

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]);
    }); 
  }
}

And simply convert to an async style in your code:

Before:

var name = getName('jvenema');

After:

getName('jvenema', function(name){

});
耳钉梦 2024-11-15 17:24:35

如果您使用 jQuery 1.5+,那么您可以只使用 deferreds。

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

并按如下方式使用延迟

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

});

If your using jQuery 1.5+ then you can just use deferreds.

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

And use deferreds as follows

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

});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文