2012-12-24 41 views
0

對於一個小項目,我有一個頁面,我意識到一個長時間的請求(2分鐘),1ms超時(只需啓動進程異步,我不知道不需要任何備份),並且每5秒發送一次AJAX呼叫。如何停止jQuery的任何進程來更改document.location

我想做一個按鈕來取消所有的AJAX調用,並改變document.location。

我用xhrPool腳本試圖取消所有的AJAX調用,然後我調用document.location行。但是,當我點擊按鈕時,腳本似乎被一些AJAX調用阻塞,並且用戶(我)需要等待20-30s,太懶。

有我的腳本:

$.xhrPool = []; 
$.xhrPool.abortAll = function() { 
    $(this).each(function(idx, jqXHR) { 
     jqXHR.abort(); 
    }); 
    $.xhrPool = []; 
}; 

$.ajaxSetup({ 
    beforeSend: function(jqXHR) { 
     $.xhrPool.push(jqXHR); 
    }, 
    complete: function(jqXHR) { 
     var index = $.xhrPool.indexOf(jqXHR); 
     if (index > -1) { 
      $.xhrPool.splice(index, 1); 
     } 
    } 
}); 

function toTime(c) { 
    var str = ''; 
    if (c > 59) { 
     str = Math.floor(c/60) + 'm '; 
     c %= 60; 
    } 
    if (c > 0) 
     str = str + c + 's'; 
    return str; 
} 

function updateProgress() { 
    $('.progress .bar').animate({ 
     width: count*4 
    }, {duration:1000, easing: 'linear'}); 
    $('.progress .bar').html(toTime(count)); 
} 

function timer() { 
    updateProgress(); 
    if (count > 0) { 
     if ((count % 5) == 0) { 
      $.ajax({ 
       url: '/?act=verifyStatus', 
       timeout: 5000 
      }).done(function(data){ 
      if (data == 'OK') 
       document.location = '/?act=found'; 
      }); 
     } 
    } else { 
     document.location = '/?act=nodelivers'; 
    } 
    count--; 
    setTimeout('timer()', 1000); 
} 

$(function(){ 
    $('.cancel').click(function(){ 
     $.xhrPool.abortAll(); 
     document.location = '/?act=form'; 
    }); 
    $.ajax({ 
     url: '/?act=doContact', 
     timeout: 1 
    }); 
    timer(); 
}); 

由於通過提前

+0

如果你要離開頁面,爲什麼還要取消? –

+0

AJAX調用本身不會阻止瀏覽器從頁面重新加載,並且在離開頁面之前不需要阻止它們。你在長時間運行的請求中使用會話嗎?可能你應該等待,因爲會話被該請求阻止,並且服務器只是將你的下一個請求放入隊列中,等待正在發佈的會話 –

+0

對不起,我不明白,因爲在你的cancel.click中,你改變了文檔位置, ),這又稱爲每1秒。 – HMarioD

回答

0

只需添加一個按鈕,設置全局變量的狀態爲「運行」或「停止」和每一個電話前,檢查,狀態變量?然後根據需要重定向。

+0

我會嘗試解決方案:)它似乎是合法的;-) – HeavyNounours

+0

不起作用:/ – HeavyNounours

0

就像FAngel所說的,第一個漫長的過程阻止了其他請求!

所以,在這個過程中,我只是添加了session_write_close();在最後一次訪問後,現在所有的工作都很好!

謝謝!