Javascript 使用setTimeout调用自身内部的函数

Javascript 使用setTimeout调用自身内部的函数,javascript,jquery,loops,settimeout,Javascript,Jquery,Loops,Settimeout,我想调用一个函数本身,如下所示: $(document).ready ( function ready() { var tester = $.ajax({ async: false, url: "test_parse.php" }).responseText; document.getElementById('test').innerHTML =

我想调用一个函数本身,如下所示:

$(document).ready ( 

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

但每次我这样做,我的浏览器都会继续加载,最终Apache会关闭(显然不是我预期的结果)。您能帮我找出一个解决方案吗?

setTimeout采用函数引用:

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
将锁定浏览器,直到数据从服务器返回为止

这是错误的:

setTimeout(ready(), 3000); 
这是正确的:

setTimeout(ready, 3000); 

ready()
实际上正在调用该函数
ready
只是对函数的引用,这正是您所需要的。

为什么要尝试在函数内部调用函数?当然,您需要做的就是将setTimeout移到函数之外,然后每隔3000毫秒调用ready()?您希望您的输出是什么?

setTimeout需要一个函数引用作为第一个参数,您有一个传递调用ready()结果的函数调用

这导致了一个无限循环

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

如果您试图对按结构化顺序发生的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设置要好,因为它会阻止浏览器。

您可以从函数外部调用setTimeout吗?另外,我认为将函数放在$(document.ready({})中是不正确的@Devin-document.ready需要一个函数表达式作为参数;所述函数是否有名称并不重要。(在任何人指出之前,我知道函数表达式不是唯一的选项,但我认为它是最常用的选项。)请记住,命名函数表达式与它们有很多关联(包括浏览器错误甚至内存泄漏),因此我会避免在生产代码中使用它们。太棒了!谢谢我知道这是个小问题。也许他出于合理的原因把
async:false
放在那里?似乎他想发出一个同步请求。。。你对此有什么问题吗?@Travis:上个月报告的IE9挂起中,有30个是由于同步XHR造成的。这是糟糕的用户体验;没有理由说OP试图做的事情不能在
success
回调函数中完成。为什么要将函数放在$(document).ready()中?为什么要使用$(document).ready()而不是$(function){}
ready()。我倾向于使用这种方法,而不是使用
setInterval
来精确地保持事情的顺序,而不是备份。
setTimeout(ready, 3000);
$.ajax({
    // your ajax settings
}).success(function () {
    // fire off the next one 3 secs after the last one completes
    setTimeout(ready, 3000);
});