【问题标题】:Why is setTimeout so fickle and semi-functional?为什么 setTimeout 如此善变和半功能性?
【发布时间】:2010-01-02 18:07:14
【问题描述】:
function load_result()
{
    $.getJSON( "http://somesite.com/loadresult.php", function(data) {
        if( data == undefined || data == null )
        {
            console.log( "no data" );
            clearTimeout( lr_timeout );
            lr_timeout = setTimeout( "load_result()", 2000 );
            return;
        }
        insert_result_price( data );
        clearTimeout( lr_timeout );
        lr_timeout = setTimeout( "load_result()", 50 * ( Math.random() * 10 ) );

    } );
}

并且lr_timeout 是全局定义的,load_result 函数最初在document.ready 函数中启动。问题是该函数并不总是运行。我将在 Firebug 中观看它,并且我有另一个设置在 setInterval 上的函数,该函数始终有效。

想法?

【问题讨论】:

  • 有点不相关:setTimeout() 的字符串参数是邪恶的[tm];在这种情况下,只需传递函数引用...

标签: javascript jquery settimeout


【解决方案1】:

您的另一个 setTimeout 函数(始终有效的函数)是否也在 $.getJSON 中?如果是这样,它是否在同一个 URL 上调用它(在您的示例中为http://somesite.com/loadresult.php,但我确信它在现实生活中有所不同)?

http://somesite.com/loadresult.php 可能是一个不稳定的资源,而您的不一致结果可能是由于该资源,而不是 setTimeout。当然,如果他们都使用相同的资源,那么这不是问题。

【讨论】:

  • 其实是一个setInterval,和loadresult资源无关。
  • 但是就像 jboxer 说的,你检查过它是否是一个不稳定的来源吗?如果数据为 null 或未定义,则永远不会调用代码中的 setTimeout。
【解决方案2】:

我通常从未遇到过 setTimeout 的问题,并且我已经在 J​​S 中将它用于主/无限循环很多次,但从未遇到过问题。我会想象一次调用 load_results 的 clearTimeout 会踩到另一次调用的 setTimeout,尤其是因为它响应的 GET 请求可能比浏览器到达下一个 setTimeout 所需的时间更长。这里实际上有多个线程在运行,您无法控制它们,也没有可用的同步机制。

【讨论】:

  • 嗯.. 它不会等待 GET 的响应,因为它在回调中吗?
  • 没错,他们真的应该按顺序进行。我想我唯一的建议是,摆脱 clearTimeout 看看它是否有所作为。
猜你喜欢
  • 2011-03-10
  • 2011-08-15
  • 2015-07-16
  • 2021-03-27
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 2017-09-01
  • 2018-07-06
相关资源
最近更新 更多