我使用setInterval,有时会发生“太快”。在这里看起来如何:
setInterval(function() {
//here comes ajax functions and so on.
}, 1000);
有时setInterval比所有那些ajax函数发生得更快,它给了我两条消息而不是一条消息。这是什么解决方案?
答案 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请求完成。
这两件事非常酷而有力。
答案 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它,以便您可以在整个代码中看到该值。对我来说,当它加快速度时,它的数值在增加,而不是重置,直到我将其包装在其中。