jQuery中的setInterval发生得太快了

时间:2011-04-15 21:02:44

标签: javascript jquery setinterval

我使用setInterval,有时会发生“太快”。在这里看起来如何:

setInterval(function() {
    //here comes ajax functions and so on. 
}, 1000);   

有时setInterval比所有那些ajax函数发生得更快,它给了我两条消息而不是一条消息。这是什么解决方案?

6 个答案:

答案 0 :(得分:10)

很难说你遇到了什么,问题有点不清楚。

setInterval对于某些事情很有用,但对于任何你将要混合其他异步内容的东西都没有。相反,请使用“重新安排setTimeout”成语:

setTimeout(doSomething, 1000);
function doSomething() {
    $.ajax("your_url", {
        success: function() {
            // Do something here

            // Do something else here
        },
        complete: function() {
            // Previous run complete, schedule the next run
            setTimeout(doSomething, 1000);
        }
    });
}

...因为,毕竟,ajax来电可能需要一秒钟才能完成。

如果这不是您遇到的问题,我的猜测是您的代码看起来像这样:

setInterval(function() {
    $.ajax("your_url", {
        success: function() {
            // Do something here
        }
    });

    // Do something else here
}, 1000);

...而且你想知道为什么“在这里做其他事情”代码在“在这里做点什么”代码之前运行。如果是这样,原因是默认情况下,ajax调用是异步。您拨打$.ajax 的电话会启动电话,但这就是全部;然后所有其他代码在成功(或错误)回调发生之前运行。

当然,解决方法是不要在顶级依赖成功回调的任何其他其他

setInterval(function() {
    $.ajax("your_url", {
        success: function() {
            // Do something here

            // Do something else here
        }
    });

}, 1000);

答案 1 :(得分:2)

使用jQuery 1.5.x,您可以将Then()用于延迟对象。这是一个很好的方式来说,一旦你完成然后()这样做。您还可以使用When()选项让它等待多个ajax请求完成。

这两件事非常酷而有力。

http://api.jquery.com/deferred.then/

http://api.jquery.com/jQuery.when/

答案 2 :(得分:1)

最好不要使用setInterval,而是每次都设置一个新的setTimeout。例如:

setTimeout(function ajaxStuff() {
    // here comes ajax functions and so on.

    setTimeout(ajaxStuff, 1000);
}, 1000);

当然,如果其中的函数是异步的,正如AJAX请求通常那样,setTimeout调用仍然会过早。在请求完成时,您需要编写一些调用setTimeout的代码。 $.when帮助您解决此问题,因为$.ajax和其他jQuery AJAX方法实现了$.Deferred

setTimeout(function ajaxStuff() {
    $.when(
        $.ajax({
            url: 'ajax1.htm'
        }),
        $.ajax({
            url: 'ajax2.htm'
        }),
        $.ajax({
            url: 'ajax3.htm'
        })
    ).done(function() {
        setTimeout(ajaxStuff, 1000);
    });
}, 1000);

答案 3 :(得分:1)

设置一个标志,指示正在进行ajax提取。当所有ajax提取完成后,清除该标志。在setInterval函数的顶部,如果设置了标志,则立即返回。

答案 4 :(得分:1)

我认为这里的问题是由于范围。即使该方法成功触发。

有了类似的问题,我可以用它来修复:

setTimeout(function(){
    load1();
}, 5000); 

function load1 () {
    console.log('loaddd1..');
    setTimeout(load2(), 4000); 
}

function load2 () {
    setTimeout(function(){
    console.log('end load2');
}, 4000); 

答案 5 :(得分:0)

遇到了这个问题,clearInterval无法正常工作。

通过将其包装在if语句中来确保只调用一次setInterval:

var interval;

if (typeof(interval) === 'undefined') {
  interval = setInterval(actFakeData,3000);
}

对我也很有帮助的是将setInterval分配给变量并console.log它,以便您可以在整个代码中看到该值。对我来说,当它加快速度时,它的数值在增加,而不是重置,直到我将其包装在其中。