为什么这个js if子句不会停止循环?

时间:2011-09-08 09:39:52

标签: javascript ajax jquery setinterval

以下是每隔10秒检查一次页面的数据(一个简单的整数)。当整数存在时(data!= null),然后提醒并停止好的间隔。

BUT 相反,它每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);
});

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:0)

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

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