![](/img/trans.png)
[英]Is is possible to synchronously check whether a script exists in the browser's cache from 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.