2012-06-01 53 views
0

我有一個每隔3秒運行一個函數的間隔。間隔被兩個Ajax調用阻塞

intervalStepper = window.setInterval('intervalTick()','3000'); 

function intervalTick() { 
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    else {// code for IE6, IE5 
     xmlhttp=new ActiveXObject('Microsoft.XMLHTTP'); 
    } 
    xmlhttp.onreadystatechange=function() { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
      gotResult(xmlhttp.responseText); 
     } 
    } 
    xmlhttp.open('GET','index.php?ajax=true',true); 
    xmlhttp.send(); 
} 
function gotResult(res) { 
    alert(res); 
} 

此外,我只是另一個Ajax調用,它運行在按鈕單擊。現在

if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
} 
else {// code for IE6, IE5 
    xmlhttp=new ActiveXObject('Microsoft.XMLHTTP'); 
} 
xmlhttp.onreadystatechange=function() { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
     agentDetailGotten(xmlhttp.responseText); 
    } 
} 
xmlhttp.open('GET','index.php?anotherPage=true',true); 
xmlhttp.send(); 

,如果我時間只運行第二個代碼時的時間間隔蜱,並執行第一個呼叫,呼叫實際上是在大約同一時間運行。但是,似乎間隔時間不知何故死亡 - 他的鴿子不再勾選。

這是一個已知的問題還是我只是沒有看到大的東西......

感謝您的幫助!

+3

您將全部**變量聲明爲隱式全局變量。使用'var'語句對''intervalTick()'函數執行本地'xmlhttp'請求。這不會解決您的問題,但它不會幫助它。 – Matt

+2

此外,你應該***永遠不會傳遞字符串到'setTimeout' /'setInterval':使用'window.setInterval(intervalTick,'3000');'代替。欲瞭解更多信息,請參閱[這裏](http://stackoverflow.com/questions/6232574/is-it-bad-practice-to-pass-a-string-to-settimeout-if-yes-why) – Matt

+1

哦, 'setTimeout'和'setInterval'的超時值應該是一個整數,而不是一個字符串,所以使用'window.setInterval(intervalTick,3000);' – Matt

回答

0

我剛纔解決它。

看來這有點像一個Firefox的錯誤(在bugzilla.mozilla.org找到)

NS_ERROR_NOT_AVAILABLE

這一次並沒有顯示出我,但我剛纔發現。它會在Firefox嘗試同時執行兩個調用時出現。

欲瞭解更多信息,我發現了一個博客條目here

我解決了這個問題,如果一個呼叫正在運行,另外一個等待的時間。

0

嘗試清除並重新設置您的間隔時間:

intervalStepper = window.setInterval('intervalTick()',3000); 

function intervalTick() { 

    window.clearInterval(intervalStepper); 

    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    else {// code for IE6, IE5 
     xmlhttp=new ActiveXObject('Microsoft.XMLHTTP'); 
    } 
    xmlhttp.onreadystatechange=function() { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
      gotResult(xmlhttp.responseText); 
     } 
    } 
    xmlhttp.open('GET','index.php?ajax=true',true); 
    xmlhttp.send(); 

    intervalStepper = window.setInterval('intervalTick()',3000); 

} 

function gotResult(res) { 
    alert(res); 
}