在我的应用程序中,我希望在一段时间后向服务器发送一些内容。 我用AJAX实现了它。但它第一次有效,但不是递归地做。我已经使用setTimeOut()来做到这一点。
var xmlHttp;
var requestURL = 'http://localhost:1092/ClassicAJAXDemo/UpdateHeartbeat.aspx?name=';
function show_data(strName)
{
if (strName.length > 0)
{
var url = requestURL + strName;
xmlHttp = GetXmlHttpObject(stateChangeHandler);
xmlHttp_Get(xmlHttp, url);
}
}
function stateChangeHandler()
{
if (xmlHttp.readyState == 4)
{
var str = xmlHttp.responseText;
setTimeOut(show_data('Dev'), 10000); // It is not waiting for 10 seconds.
}
}
function xmlHttp_Get(xmlhttp, url)
{
xmlhttp.open('GET', url, true);
xmlhttp.send(null);
}
function GetXmlHttpObject(handler)
{
return new XMLHttpRequest();
}
window.onload = show_data('Dev');
答案 0 :(得分:5)
您在此代码段中遇到了一些问题:
window.onload = show_data('Dev');
关于为什么window.onload = show_data('Dev');
不起作用的一些解释可能是有序的:window.onload
需要是一个函数。当您的代码执行时,它正在评估show_data('Dev')
(它不会返回值,但会启动XMLHTTPRequest,因此它似乎可以工作)并执行window.onload = undefined;
。
window.onload=show_data;
会起作用 - 但是你不会传递你的参数。
幸运的是,JavaScript允许您创建匿名函数 - 导致:
window.onload = function() { show_data('Dev'); };
setTimeOut(show_data('Dev'), 10000);
首先,JavaScript是一种区分大小写的语言。 setTimeOut !== setTimeout
。此外,setTimeout / setInterval的第一个参数应该是一个函数,它在这里遇到与window.onload
所做的相同的问题,它调用setTimeout(undefined, 10000);
,但是立即执行请求。我也认为你的意思是用与调用它相同的strName
来调用它。
您的超时设置应该说:
setTimeout(function() {show_data(strName);}, 10000);
旁注 - setInterval()
和setTimeout()
都允许传递在运行时获得eval()
的字符串,但我建议不要使用看起来像这样的方法:
// please dont use me
setTimeout("show_data(strname)", 10000);
此时,您的代码在使用这两行进行编辑时应该可以正常工作。剩下的这些东西只是其他优化
setTimeout()
与setInterval()
这似乎是每隔10000毫秒检查一次,除非ajax请求失败,否则它将停止。我想你只是想永远投票。 setInterval()
允许您设置“重复”计时器。
删除setTimeout
行并将window.onload
替换为:
var updateInterval;
window.onload = function(){
updateInterval = setInterval(function(){ show_data('Dev'); }, 10000);
};
// an example - lets stop polling 35 seconds from now
setTimeout(function() {
clearInterval(updateInterval);
}, 35000);
答案 1 :(得分:2)
替换
window.onload = show_data('Dev');
与
window.onload = function() {
var intervalID = setInterval( function(){ show_data('Dev')}, 10000);
}
并删除
setTimeOut(show_data('Dev'), 10000);
来自stateChangeHandler
函数。
并且不要忘记清除间隔
使用
clearInterval(intervalID);
setInterval
和setTimeout
之间的区别在于,setTimeout()
只触发表达式一次,而setInterval()
一次又一次地触发表达式(除非你告诉它停止)
答案 2 :(得分:1)
而不是:
setTimeOut(show_data('Dev'), 10000);
你能尝试过吗
setTimeOut(function() { show_data('Dev') }, 10000);
答案 3 :(得分:1)
你的window.onload方法肯定是错误的。用这个代替:
window.onload = function(){var intervalID = setInterval(function(){show_data('Dev')}, 10000);}
这里的其他答案似乎涵盖了其他问题所以我不会触及它。欢呼声