2010-06-15 101 views
3

好吧,我正在試圖建立一個AJAX聊天系統,每400ms輪詢聊天數據庫。該部分正在工作,其中的一部分不是活動用戶列表。當我試圖合併這兩個請求時,前兩個請求被完成,然後整個事情變得雪球起來,通常定時(12秒)的活動用戶列表請求開始每1ms更新一次,第一個請求再也不會發生。顯示的是兩個請求整個AJAX代碼:雙AJAX請求在不同的時間

var waittime=400;chatmsg=document.getElementById("chatmsg"); 
room = document.getElementById("roomid").value; 
chatmsg.focus() 
document.getElementById("chatwindow").innerHTML = "loading..."; 
document.getElementById("userwindow").innerHTML = "Loading User List..."; 
var xmlhttp = false; 
var xmlhttp2 = false; 
var xmlhttp3 = false; 
function ajax_read(url) { 
if(window.XMLHttpRequest){ 
    xmlhttp=new XMLHttpRequest(); 
    if(xmlhttp.overrideMimeType){ 
     xmlhttp.overrideMimeType('text/xml'); 
    } 
} else if(window.ActiveXObject){ 
    try{ 
     xmlhttp=new ActiveXObject("Msxml2.XMLHTTP"); 
    } catch(e) { 
     try{ 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } catch(e){ 
     } 
    } 
} 
if(!xmlhttp) { 
    alert('Giving up :(Cannot create an XMLHTTP instance'); 
    return false; 
} 
xmlhttp.onreadystatechange = function() { 
if (xmlhttp.readyState==4) { 
    document.getElementById("chatwindow").innerHTML = xmlhttp.responseText; 
    setTimeout("ajax_read('methods.php?method=r&room=" + room +"')", waittime); 
    } 
} 
xmlhttp.open('GET',url,true); 
xmlhttp.send(null); 
} 
function user_read(url) { 
if(window.XMLHttpRequest){ 
    xmlhttp3=new XMLHttpRequest(); 
    if(xmlhttp3.overrideMimeType){ 
     xmlhttp3.overrideMimeType('text/xml'); 
    } 
} else if(window.ActiveXObject){ 
    try{ 
     xmlhttp3=new ActiveXObject("Msxml2.XMLHTTP"); 
    } catch(e) { 
     try{ 
      xmlhttp3=new ActiveXObject("Microsoft.XMLHTTP"); 
     } catch(e){ 
     } 
    } 
} 
if(!xmlhttp3) { 
    alert('Giving up :(Cannot create an XMLHTTP instance'); 
    return false; 
} 
xmlhttp3.onreadystatechange = function() { 
if (xmlhttp3.readyState==4) { 
    document.getElementById("userwindow").innerHTML = xmlhttp3.responseText; 
    setTimeout("ajax_read('methods.php?method=u&room=" + room +"')", 12000); 
    } 
} 
xmlhttp3.open('GET',url,true); 
xmlhttp3.send(null); 
} 
function ajax_write(url){ 
if(window.XMLHttpRequest){ 
    xmlhttp2=new XMLHttpRequest(); 
    if(xmlhttp2.overrideMimeType){ 
     xmlhttp2.overrideMimeType('text/xml'); 
    } 
} else if(window.ActiveXObject){ 
    try{ 
     xmlhttp2=new ActiveXObject("Msxml2.XMLHTTP"); 
    } catch(e) { 
     try{ 
      xmlhttp2=new ActiveXObject("Microsoft.XMLHTTP"); 
     } catch(e){ 
     } 
    } 
} 
if(!xmlhttp2) { 
    alert('Giving up :(Cannot create an XMLHTTP instance'); 
    return false; 
} 
xmlhttp2.open('GET',url,true); 
xmlhttp2.send(null); 
} 
function submit_msg(){ 
nick = document.getElementById("chatnick").value; 
msg = document.getElementById("chatmsg").value; 
document.getElementById("chatmsg").value = ""; 
ajax_write("methods.php?method=w&m=" + msg + "&n=" + nick + "&room=" + room + ""); 
} 
function keyup(arg1) { 
if (arg1 == 13) submit_msg(); 
} 
var intUpdate = setTimeout("ajax_read('methods.php')", waittime); 
var intUpdate = setTimeout("user_read('methods.php')", waittime); 
+0

好吧,這幾乎就像迷信,但我已經與併發的XMLHttpRequests(尤其是在IE) – Pointy 2010-06-15 23:49:31

+0

厄運不幸,我寧願不使用併發請求,但我不知道另一種方式來實現這一點。 – Nik 2010-06-15 23:55:03

+0

也許嘗試使用不同的等待時間來抵消這兩個請求? – Banjer 2010-06-15 23:57:20

回答

2

的問題是,在user_read計時器設置一臺運行ajax_read後12秒,用正確的URL。因此,當調用ajax_read時,它會提取信息並設置新的超時,此時在waittime之後調用ajax_read?method=r…。所以在user_read的第一次超時之後,它不會再被調用。我只是在本地Web服務器上看到了Firebug的一個僞造形式和methods.php(網絡面板)。在將waittime設置爲4000並使用.innerHTML += …後,變得清楚,導致每4秒呼叫兩個

index.html(我知道,這是quick'n'dirty):

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset=UTF-8> 
    <title>Chat</title> 
</head> 
<body> 
    <input id="chatnick" type="text" value="Nickname"><br> 
    <input id="roomid" type="text" value="4"><br> 
    <input id="chatmsg" type="text"><br> 
    <div id="userwindow" style="width: 500px; height: 300px"></div><br> 
    <div id="chatwindow" style="width: 300px; height: 300px"></div><br> 
    <script src="js.js"></script> 
</body> 
</html> 

methods.php

blah<br> 

另外要注意的可能性xmlhttp.status可能不是200

+0

因此,如何解決這個問題,我可以看到將user_read調用重命名爲user_read(而不是ajax_read),但是這是唯一的問題,這意味着這是唯一的原因,它是滾雪球? – Nik 2010-06-16 01:15:00

+1

@Nik - 當我糾正了這個函數調用,並把'waittime'恢復到400時,所有的東西似乎運行良好*使用本地web服務器*。我不知道在現實世界的慢速連接情況下會發生什麼情況,有很多請求,但我不想在自己公司的服務器上投入太多的負擔。順便說一句,我認爲你可以重新分配你的代碼:傳遞一個字符串而不是一個函數引用到'setTimeout'不是一個好主意(方式更慢,而且大多是不必要的),並且該XMLHttpRequest代碼有三次效率不高。 – 2010-06-16 01:29:20

+0

@Marcel,我不太清楚如何合併請求,我不明白你說我不應該傳遞一個字符串,因爲對setTimeout的引用是一個函數(ajax_chat(url))。 – Nik 2010-06-16 01:36:35