繁体   English   中英

jQuery中的setInterval发生得太快了

[英]setInterval in jQuery happens too fast

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

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

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

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

setInterval非常适合某些事情,但不适用于任何你将混合其他异步内容的东西。 相反,使用“rescheduling 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);

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

这两件事非常酷而有力。

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

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

最好不要使用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);

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

我认为这里的问题是由于范围。 尽管方法成功触发了。

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

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

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

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

有这个问题,clearInterval无法正常工作。

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

var interval;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM