【问题标题】:Calling a function inside itself using setTimeout使用 setTimeout 在自身内部调用函数
【发布时间】:2011-11-14 05:49:41
【问题描述】:

我想像这样在其内部调用一个函数:

$(document).ready ( 

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

但每次我这样做时,我的浏览器都会不断加载,最终 Apache 会关闭(显然不是我的预期结果)。你能帮我找出解决办法吗?

【问题讨论】:

  • 你能从函数外部调用 setTimeout 吗?
  • 我也认为将函数放入 $(document).ready({}); 中是不正确的;
  • @Devin - document.ready 期望函数表达式作为参数;所述函数是否有名称并不重要。 (在有人指出之前,我知道函数表达式不是唯一的选项,但我认为它是最常用的选项。)
  • 请记住,命名函数表达式有很多 quirks and issues 与之相关联(包括浏览器错误甚至内存泄漏),所以我会避免在生产代码中使用它们 .

标签: javascript jquery loops settimeout


【解决方案1】:

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

【讨论】:

  • 也许他把async:false放在那里是出于正当理由?
  • 他好像是要同步请求……你有这个问题吗?
  • @Travis: There is no good reason to make a synchronous XHR request. 8.4% 上个月报告的 IE9 挂起是由于同步 XHR。这是糟糕的用户体验;没有理由不能在 success 回调函数中完成 OP 尝试做的事情。
  • 为什么要把函数放在 $(document).ready() 里面?为什么要使用 $(document).ready() 而不是 $(function) {}; ?
【解决方案2】:

这是错误的:

setTimeout(ready(), 3000); 

这是对的:

setTimeout(ready, 3000); 

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

【讨论】:

  • 太棒了!谢谢。我知道这是小事。
【解决方案3】:

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 设置更好,后者会阻止浏览器。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • ready() 调用自身(通过成功回调),这样如果$.ajax 调用之一花费的时间过长,事情就不会得到支持。我倾向于使用这种方法而不是setInterval,正是为了让事情井井有条,而不是备份。
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多