javascript setInterval()延迟和执行时间的冲突
javascript setInterval() collision between the delay and execution time
如果执行时间长于使用setInterval()
的延迟,有没有办法避免延迟和执行时间之间的冲突?
例如:
setInterval(function(){
// some code that takes 300 ms to be executed
// which it's longer than the delay 200 ms
}, 200);
我已经找到了替代方法,就是使用setTimeout()
递归来保证函数执行后立即开始延迟,但我的问题是关于setInterval()
,而不是替换它与 setTimeout()
如果之前 运行 的代码不完整,我假设您只是想推迟 setInterval
的循环。
var starts = 0;
var ends = 0;
function myFunc () {
starts++;
//doStuff
ends++;
}
setInterval(function () {
if (starts === ends) {
myFunc();
}
}, 200);
您不能使用 setInterval
执行此操作,只能使用 setTimeout
。如果你的问题是缺少容易取消的setTimeout
方法,你可以使用如下:
var timeout = setTimeout(function runMe(){
// some code that takes 300 ms to be executed
timeout = setTimeout(runMe, 200);
}, 200);
// somewhere else
clearTimeout(timeout);
我不确定你关心的是什么。
Javascript 始终是单线程的,这意味着在执行 setInterval 调用的函数时不会执行其他函数,并且不会发生 setInterval 的重新运行!
自然地,如果在调用 setInterval 的函数中使用延迟调用,则可以使函数完成并再次执行。
为了防止出现此类问题,您可以使用一个简单的信号量,例如:
var inProcessing = false ;
setInterval(function(){
// some code that takes 300 ms to be executed
// which it's longer than the delay 200 ms
if (!inProcessing){
inProcessing = true ;
$http.get(...).then(function(){inProcessing = false;...},
function(){inProcessing = false;...});
}
}
}, 200);
您可以使用嵌套的 setTimeout 而不是 setInterval。希望你喜欢 !
https://javascript.info/settimeout-setinterval
如果执行时间长于使用setInterval()
的延迟,有没有办法避免延迟和执行时间之间的冲突?
例如:
setInterval(function(){
// some code that takes 300 ms to be executed
// which it's longer than the delay 200 ms
}, 200);
我已经找到了替代方法,就是使用setTimeout()
递归来保证函数执行后立即开始延迟,但我的问题是关于setInterval()
,而不是替换它与 setTimeout()
如果之前 运行 的代码不完整,我假设您只是想推迟 setInterval
的循环。
var starts = 0;
var ends = 0;
function myFunc () {
starts++;
//doStuff
ends++;
}
setInterval(function () {
if (starts === ends) {
myFunc();
}
}, 200);
您不能使用 setInterval
执行此操作,只能使用 setTimeout
。如果你的问题是缺少容易取消的setTimeout
方法,你可以使用如下:
var timeout = setTimeout(function runMe(){
// some code that takes 300 ms to be executed
timeout = setTimeout(runMe, 200);
}, 200);
// somewhere else
clearTimeout(timeout);
我不确定你关心的是什么。
Javascript 始终是单线程的,这意味着在执行 setInterval 调用的函数时不会执行其他函数,并且不会发生 setInterval 的重新运行!
自然地,如果在调用 setInterval 的函数中使用延迟调用,则可以使函数完成并再次执行。 为了防止出现此类问题,您可以使用一个简单的信号量,例如:
var inProcessing = false ;
setInterval(function(){
// some code that takes 300 ms to be executed
// which it's longer than the delay 200 ms
if (!inProcessing){
inProcessing = true ;
$http.get(...).then(function(){inProcessing = false;...},
function(){inProcessing = false;...});
}
}
}, 200);
您可以使用嵌套的 setTimeout 而不是 setInterval。希望你喜欢 ! https://javascript.info/settimeout-setinterval