Javascript setTimeout在ajax加载的页面中激发的次数与页面中激发的次数相同

Javascript setTimeout在ajax加载的页面中激发的次数与页面中激发的次数相同,javascript,ajax,settimeout,Javascript,Ajax,Settimeout,我正在通过ajax调用加载的页面中执行setTimeout函数。但是,如果我再次单击链接加载页面,恐怕最后一个setTimeout调用仍会继续,并且setTimeout设置的调用间隔数会执行多次 这是远程页面: var RefreshInterval = null; clearTimeout(RefreshInterval); function someFunction() { .... setNextRefresh(); } function setNextRefresh() {

我正在通过ajax调用加载的页面中执行setTimeout函数。但是,如果我再次单击链接加载页面,恐怕最后一个setTimeout调用仍会继续,并且setTimeout设置的调用间隔数会执行多次

这是远程页面:

var RefreshInterval = null;
clearTimeout(RefreshInterval);

function someFunction()
{
....
    setNextRefresh();

}

function setNextRefresh() {
    console.log(wifiRadarRefreshInterval);
    RefreshInterval = null;
    clearTimeout(RefreshInterval);
    RefreshInterval = setTimeout('someFunction();', 20*1000);
}

声明
var RefreshInterval=null在ajax加载的页面之外,并在页面上使用以下代码:

clearTimeout(RefreshInterval);

function someFunction()
{
....
    setNextRefresh();

}

function setNextRefresh() {
    console.log(wifiRadarRefreshInterval);
    clearTimeout(RefreshInterval);
    RefreshInterval = setTimeout('someFunction();', 20*1000);
}
不要用这个

var RefreshInterval = null;
clearTimeout(RefreshInterval);
实际上,您正在
分配一个空值,然后试图清除它。这将不起作用,必须使用
clearTimeout
并通过传递分配给setTimeout的变量来清除超时。在这里,您将传递一个空值,因此计时器永远不会被清除

下面是一个小示例,它将演示如何解决您的问题

因此,与其将变量设置为null然后尝试清除它,只需检查变量是否未定义,如果已定义,则清除它,否则继续。使用下面的代码,还必须删除上面提到的两行

   function setNextRefresh() {

     console.log(wifiRadarRefreshInterval);

     if (typeof RefreshInterval !== 'undefined') {
       clearTimeout(RefreshInterval);
     }

     RefreshInterval = setTimeout('someFunction();', 20*1000);
   }
点击按钮4次,输出只打印一次。也就是说,如果ajax调用是设置的超时的4倍,则只能执行一次。检查下面的代码片段以获取演示

var clickCount=0;//只是为了保持ajax调用的数量
函数NewPageSimilator(clicksTillNow){//这将充当一个新页面。让我们在ajaX调用中加载整个内容
如果(刷新间隔的类型!=='undefined'){
清除超时(刷新间隔);
}
函数setNextRefresh(){
window.RefreshInterval=setTimeout(打印时间,3000);//20*1000
}
函数printTime(){//dumy函数用于打印时间
document.getElementById(“输出”).innerHTML+=“我是在单击编号“+clicksTillNow+”
时创建的”; } setNextRefresh(); } document.getElementById(“ajaxCall”).addEventListener(“单击”,function(){//这将通过再次加载脚本充当ajax调用 点击计数++; 新建页面模拟器(单击计数); }); document.getElementById(“clear”).addEventListener(“单击”,函数(){//reset演示 点击计数=0; document.getElementById(“输出”).innerHTML=“”; });

AJAX调用 清楚的
如果我不想在父页面中声明它,下面是我找到的解决方案:

//Clear previously loaded calls if exists
try{    clearTimeout(wifiRadarRefreshInterval); }catch(e){}
var wifiRadarRefreshInterval = null;

function somefunction(){
    ....
    setNextRefresh();
}

function setNextRefresh() {

    try{

        clearTimeout(wifiRadarRefreshInterval);
        wifiRadarRefreshInterval = null;
        wifiRadarRefreshInterval = setTimeout('somefunction();', 20*1000);
    }
    catch(e){
        console.log(e.message + e.stack);
    }   
}

你能摆弄一下吗?做
RefreshInterval=null;清除超时(刷新间隔)?如果
RefreshInterval
为空,则无法清除以前的超时我发现,一旦某些浏览器的此技巧不适用于clearTimeout()@AmitShah setTimeout将返回可用于clearTimeout的id(一个数字),如果设置为空,则clearTimeout不知道清除什么。谢谢@Reddy,但我使用的是“使用严格”。所以必须首先声明变量。