jQuery中的setInterval发生得太快了

| 我使用setInterval有时有时会“太快”。这里看起来如何:
setInterval(function() {
    //here comes ajax functions and so on. 
}, 1000);   
有时setInterval的发生速度比所有这些ajax函数都要快,它给了我两条消息,而不是一条。有什么解决办法?     
已邀请:
很难说出您正在遇到什么,这个问题有点不清楚。
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);
    
使用jQuery 1.5.x时,可以将then()用于延迟的对象。完成后,这是一种很好的说法,那就then()做到这一点。您还可以使用When()选项使其等待多个ajax请求完成。 这两件事非常酷而且强大。 http://api.jquery.com/deferred.then/ http://api.jquery.com/jQuery.when/     
设置一个标志,指示正在进行ajax提取。当所有的ajax获取完成时,清除该标志。在
setInterval
函数的顶部,如果设置了该标志,则立即返回。     
最好不要使用
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);
    
我认为这里的问题是由于范围。即使该方法已成功触发。 对于类似的问题,我能够使用它来解决:
setTimeout(function(){
    load1();
}, 5000); 

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

function load2 () {
    setTimeout(function(){
    console.log(\'end load2\');
}, 4000); 
    
遇到了这个问题,clearInterval无法正常工作。 通过将其包装在if语句中,确保只调用一次setInterval:
var interval;

if (typeof(interval) === \'undefined\') {
  interval = setInterval(actFakeData,3000);
}
对我也有帮助的是将setInterval分配给变量并console.log它,以便您可以在整个代码中看到该值。对我来说,当它加快速度时,它的数值在增加,而不是重置,直到我将其包装在其中。     

要回复问题请先登录注册