克里曼特,
我想您可以通过多种方式对此进行编码。这是一个:
var INFOS = (function(){
var infoCache = {},
promises = {},
fetching = null;
var load = function(id) {
if(!promises[id]) {
promises[id] = $ajax({
//ajax options here
}).done(function(info){
infoCache[id] = info;
delete promises[id];
});
}
return promises[id];
}
var display = function(id, $container) {
if(fetching) {
//cancel display (but not loading) of anything latent.
fetching.reject();
}
if(infoCache[id]) {
//info is already cached, so simply display it.
$container.text(infoCache[id]);
}
else {
fetching = $.Deferred().done(function() {
$container.text(infoCache[id]);
});
load(id).done(fetching.resolve);
}
}
return {
load: load,
display: display
};
})();
正如您将看到的,所有复杂性都捆绑在 namespaceINFOS
中,它公开了两种方法;load
和display
。
以下是调用方法的方法:
$(function() {
itemIds = ["p7", "p8", "p9"];
//preload
$.each(itemIds, function(i, id) { INFOS.load(id); });
//load into cache on first click, then display from cache.
$('li').on('click', function() {
var id = $(this).data('item-id');
INFOS.display(id, $('#info'));
});
});
DEMO(带模拟 ajax)
这里的技巧是:
- 缓存由 id 索引的信息
- 缓存活动的 jqXHR 承诺,由 id 索引
- 如果以前加载过,则显示缓存中的信息...
- ...否则,每次请求信息时,创建一个与信息显示关联的延迟,可以独立于相应的 jqXHR 解决/拒绝。