[英]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请求完成。
这两件事非常酷而有力。
最好不要使用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.