2011-09-08 59 views
0

下面是应该每10秒钟检查一次数据页面(一个简单的整数)。当整数存在时(data!= null),然后提醒并停止好的时间间隔)。为什么这个js if子句不停止循环?

但是 相反,它每隔10秒排队一次警报。当脚本终于找到它正在寻找的整数时,大量的警报弹出......每十秒钟一次。如果脚本持续50秒,则会在页面加载50秒后立即收到5条警报。

有什么问题? if (data != null) {是否不应该阻止警报触发......直到有数据?我很茫然。另外,“数据”从不出现在警报中。

var pinger; 
$(document).ready(function() { 
    var pinger = setInterval(function(){ 
     $.get("/ajax.php", function(data) { 
      if (data != null) {  /** Shouldn't this line stop loops? **/ 
       alert("alert" + data); 
       clearInterval(pinger); 
      } 
     }); 
    }, 10000); 
}); 
+0

您正在定义您的pinger变量两次。您是否尝试省略第一个(全局)声明? – m90

+0

为了使clearInterval正常工作,我已经阅读过此类文档。但是我遇到了更大的问题... setTimeout是要走的路。 – Ryan

回答

1

/ajax.php比setInterval()调用函数的延迟花费的时间更多。所以当它结束时,setInterval()实际上已经多次调用该函数。

使用的setTimeout()代替的setInterval():

$(document).ready(function() { 
    setTimeout(function self(){ 
     $.get("/ajax.php", function(data) { 
      if (data != null) { 
       alert("alert" + data); 
      } else { 
       setTimeout(self, 10000); 
      } 
     }); 
    }, 10000); 
}); 
+0

太好了。非常感谢。该脚本现在几乎可以完美运行。但是,我使用了:alert(“text”+ data +“text”);'和输出是“texttext”,当它应该是“text12345text”。数据本身没有传递? – Ryan

+0

这意味着你的ajax.php脚本返回了一个空字符串 – arnaud576875

+0

ha,只需要替换alert(“alert”+ text);通过alert(“alert”+ data); – arnaud576875

0

我敢打赌,你不从$.get得到一个空(即使有一个空字符串,然后比较为null返回true - '' != null返回true)。这就是警报弹出的原因。

此外,有些人提出了一个很好的观点,即如果您的ajax调用需要超过10秒钟,那么即使先前的ajax可能会返回假设停止循环的正确数据,也会触发另一次。