0

如果这已经被覆盖,请原谅我,但我保证事先已经搜索过。我得到一连串的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);
}
4

1 回答 1

0

我建议这样做可以摆脱计时器轮询。这会在加载挂起时设置一个标志,当更新完成时,它会检查下一个加载是否处于挂起状态,而不是轮询:

// 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;
    }
}
于 2012-09-08T17:27:32.097 回答