我需要通过给定的延迟多次调用某些函数。我该怎么办 - 为timer定义变量并将其传递给调用函数,以便在某个时刻停止计时器或循环(n次)调用setTimeout一次(或另一种方法来延迟一次延迟时间)或其他。谢谢。
编辑修复语法错误
var timerID = null;
var n = 5;
this.timerID = setInterval(function(){
funcToInvoke(n,timerID){
if(invokeNumber == n){
clearInterval(timerID);
return;
}
else { do something}
}
},delay)
答案 0 :(得分:3)
是的,这种方法很常见,比在循环中调用setTimeout
更好(具有固定次数)。它比这更高效,也更灵活,因为间隔将动态停止(可能会检查未来的情况)。
但是,你的代码有点乱。修正:
// Assuming we a have
// n
// delay
// funcToInvoke
// and execute in context of some object
var that = this,
numberOfInvokes = 0;
this.timer = setInterval(function() {
// "this" points to the global object
if (numberOfInvokes == n)
clearInterval(that.timer);
else
funcToInvoke(numberOfInvokes);
numberOfInvokes++;
}, delay);
答案 1 :(得分:2)
您当前的方法存在语法问题,您不能拥有像this.timerID
这样的函数参数。实际上,您应该删除整个funcToInvoke
声明,并将n
和timerID
声明为局部变量,以便它们可用于闭包。像这样:
// Don't forget to define n here!
var n = 5;
// Change timerID to local var instead of property
var timerID = null;
timerID = setInterval(function(){
if(invokeNumber == n){
clearInterval(timerID);
return;
} else {
//do something
}
// You can setTimeout again anywhere in this function if needed
}, delay);
答案 2 :(得分:1)
如果你想要一个近似的延迟,setInterval可能没问题。如果你想要一个更精确的间隔,那么重复调用setTimeout会更好,因为你可以根据自上次调用以来的时间调整下一次调用的时间长度。
E.g。对于每秒钟滴答的时钟,你可以重复调用setTimeout,将滞后设置为刚好在下一整秒之后。