簡體   English   中英

在js中同步管理緩存

[英]Managing cache synchronously in js

我使用全局緩存變量中的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中實現“按需緩存”功能,而無需每次使用都有專門的回調?

您將需要回調,因為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){

});

如果您使用的是jQuery 1.5+,那么您可以使用延期。

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

並如下使用遞延

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

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM