1

在我的应用程序中,我想在一段时间后向服务器发送一些东西。我已经使用 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');
4

4 回答 4

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);
于 2009-09-19T07:10:59.400 回答
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和之间的区别在于setTimeoutsetTimeout()仅触发一次表达式,而setInterval()一次又一次地触发表达式(除非您告诉它停止)。

于 2009-09-19T06:05:24.463 回答
1

您的 window.onload 方法肯定是错误的。用这个替换它:

window.onload = function(){var intervalID = setInterval(function(){show_data('Dev')}, 10000);}

这里的其他答案似乎涵盖了其他问题,所以我不会触及。干杯

于 2011-10-13T20:06:04.607 回答
1

代替:

setTimeOut(show_data('Dev'), 10000);

您可以/是否尝试过:

setTimeOut(function() { show_data('Dev') }, 10000);

?

于 2009-09-19T07:08:30.233 回答