在我的应用程序中,我想在一段时间后向服务器发送一些东西.我用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');
Run Code Online (Sandbox Code Playgroud)
您在此代码段中有几个问题正在创建您的错误:
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'); };
Run Code Online (Sandbox Code Playgroud)
setTimeOut(show_data('Dev'), 10000);首先,JavaScript是一种区分大小写的语言. setTimeOut !== setTimeout.此外,setTimeout/setInterval的第一个参数应该是一个函数,它在这里遇到的问题与window.onload它调用的问题相同setTimeout(undefined, 10000);,但会立即执行请求.我也认为你的意思是用它调用它来调用它strName.
你的超时设置应该说:
setTimeout(function() {show_data(strName);}, 10000);
Run Code Online (Sandbox Code Playgroud)
旁注- setInterval()并且setTimeout()都允许通过这串获得eval()在运行时版,但我建议不要使用这种方法看起来像这样:
// please dont use me
setTimeout("show_data(strname)", 10000);
Run Code Online (Sandbox Code Playgroud)
此时,使用这两行编辑时,代码应该可以正常工作.剩下的这些东西只是其他优化
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);
Run Code Online (Sandbox Code Playgroud)