如果已经涵盖了这一点,请原谅,但我保证会事先搜索。我得到了一个AJAX
获取请求链,每30秒更新一列。基于这些更新显示用于加载新内容的按钮,再次加载新内容并重置相关会话变量。
当然,碰撞也会发生。
在ATM中,我通过AJAX
成功后再次释放的变量单独阻塞每一列,而如果变量被阻塞,则设置间隔。
现在,有什么优雅的方法可以做到这一点吗?我摆弄了延迟对象和.ajaxStop
,但没有用。我在某个地方读到,jQuery 1.5/$.done()
等应该为Ajax调用引入某种线程管理吗?我如何利用这一点?
//timed update
function refresh() {
if (BLOCKED != 1) {
BLOCKED = 1;
$.ajax({
url: 'update',
success: function(data) {
BLOCKED = 0;
}
});
}
//click function
function load() {
if (BLOCKED != 1) {
BLOCKED = 1;
$.ajax({
url: '/load'
});
} else setTimeout("load()", 500);
}
我建议取消计时器轮询。这会在加载挂起时设置一个标志,当更新完成时,它会检查下一个加载是否挂起,而不是轮询:
// global state
var inFlight = false;
var pendingLoad = false;
function checkPendingLoad() {
if (pendingLoad) {
pendingLoad = false;
load();
}
}
function refresh() {
if (!inFlight) {
inflight = true;
$.ajax({
url: 'update',
complete: function(data) {
inFlight = false;
checkPendingLoad();
}
});
}
}
//click function
function load() {
if (!inFlight) {
inFlight = true;
$.ajax({
url: '/load',
complete: function(data) {
inFlight = false;
checkPendingLoad();
}
});
} else {
pendingLoad = true;
}
}