日期:2014-05-16  浏览次数:20374 次

大家帮忙看一个问题,为什么requestTime有时候比response还小
本帖最后由 loshu2003 于 2013-09-05 15:00:52 编辑
大家帮忙看一下,下面的代码,为什么有时候responseTime会比requestTime小,该怎么改,谢谢各位!

var run = function()
{
var timeout = 0;
if(interfaces.length == 0)
{
return;
}

var interface = interfaces[0];

if(autoXMLHttp != null)
{
requestTime = new Date();
autoXMLHttp.open(METHOD, TESTING_URL, true);
autoXMLHttp.onreadystatechange = function()
{   
if (autoXMLHttp.readyState === 4 && (autoXMLHttp.status === 200 || autoXMLHttp.status === 304)) 
{
alert(interface.actionCode);
responseTime = new Date();
if(interface.callback != null)
{
timeout = interface.callback(interfaces,autoXMLHttp);
}

autoCreateHistory(interface.actionCode,interface.content,requestTime,autoXMLHttp.responseText,responseTime);

//如果队列中还有请求,就接着递归执行executeAjax函数,直到队列为空   
if (interfaces.length > 0) 
{   
//删除队列中的第一个请求   
interfaces.shift();
setTimeout(run,timeout);
}
}
}
autoXMLHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
autoXMLHttp.send(interface.content || null);
}
}

run();

------解决方案--------------------
有可能 request 比 response小。。。
参考的节点:
1、请求的时候 带的cookie比较大,比如超过2k,或者 提交的表单内容比较丰富有几M甚至更大
2、请求的时候 查询dns花费的时间过长
3、请求到达服务器的时候服务器阻塞ing,有等待

对应的:
1、response输出的内容为空,或者很只有一个成功与否的标记
2、dns建立之后,response是没有这个阶段的
3、虽然请求被阻塞,但是一旦阻塞消失,response的内容并不多,立即就返回了
------解决方案--------------------
你的 onreadystatechange 这个事件,在每次open后又重新注册了
if(autoXMLHttp != null)
            {
                autoXMLHttp.open(METHOD, TESTING_URL, true);
                autoXMLHttp.onreadystatechange = function(){}

可能有影响,你试试写成
if(!autoXMLHttp.onreadystatechange)
autoXMLHttp.onreadystatechange = function(){}

------解决方案--------------------
引用:
Quote: 引用:

认真看了一遍,大概知道是什么原因了

requestTime = new Date();, responseTime = new Date(); 都没有加 var  是全局的 
并且   onreadystatechange 事件里只能取到一个requestTime 值状态,事件又是异步的所以产生了交错

似乎是这个道理,但是我把requestTime和responseTime都改成局部变量,还是一样的结果

并且   onreadystatechange 事件里只能取到一个requestTime 值状态 ,因为是同个做用域 ,只能取到一个requestTime 值状态