使用setTimeout在自身内部调用函数

时间:2011-09-10 04:46:29

标签: javascript jquery loops settimeout

$(document).ready ( 

    function ready() {
        var tester = $.ajax({
                async: false,
                url: "test_parse.php"
            }).responseText;
        document.getElementById('test').innerHTML = tester;
        setTimeout(ready(), 3000); 
   }

);

嘿伙计我想在这个内部调用一个函数但是每次我这样做时我的浏览器都会继续加载并最终Apache关闭(显然不是我预期的结果)。认为你们可以帮我找出解决方案吗?谢谢!

4 个答案:

答案 0 :(得分:10)

setTimeout采用函数引用:

setTimeout(ready, 3000); 

setTimeout(ready(), 3000); 

话虽如此,我也会这样做:

$(document).ready ( 

    function ready() {
        var tester = $.ajax({
                url: "test_parse.php",
                success: function (data) {
                    document.getElementById('test').innerHTML = data;
                    setTimeout(ready, 3000); 
                }
            })
   }

);

因为async: false将锁定浏览器,直到数据从服务器返回

答案 1 :(得分:6)

这是错误的:

setTimeout(ready(), 3000); 

这是对的:

setTimeout(ready, 3000); 

ready()实际上正在调用该函数。 ready只是对函数的引用,这就是你想要的。

答案 2 :(得分:2)

setTimeout要求函数引用作为第一个参数,你有一个函数调用,它传递调用ready()的结果。

这导致无限循环。

你需要传入“ready”,而不是“ready()”

setTimeout(ready, 3000);

如果您正在尝试按结构化顺序对ajax请求进行排队,那么您需要在上一次ajax调用之后成功触发setTimeout,而不是立即触发,否则您将返回ajax结果并在任意间隔取决于服务器如何响应每个请求。

$.ajax({
    // your ajax settings
}).success(function () {
    // fire off the next one 3 secs after the last one completes
    setTimeout(ready, 3000);
});

这比使用阻止浏览器的async:false设置要好。

答案 3 :(得分:0)

你为什么试图在自己内部调用这个函数?当然,你需要做的就是在函数外部移动setTimeout,然后每隔3000ms调用ready()?你想要什么输出?