jQuery中的AJAX线程管理



如果已经涵盖了这一点,请原谅,但我保证会事先搜索。我得到了一个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;
    }
}

最新更新