2010-06-15 136 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