[英]setTimeout and recursive function with parameters
我正在尝试做这样的事情:
我只想在选项卡加载类时才调用doSomething()函数(可能需要3或5秒钟)。
function addInfosSinistre(msg){
addInfosSinistreRecursive(msg, 0);
}
function addInfosSinistreRecursive(msg, nbCalls) {
if ($("#tab").hasClass('loaded')) {
doSomething();
}else if (nbCalls < 10) {
setTimeout(addInfosSinistreRecursive(msg, nbCalls+1),500);
}
}
这不起作用,似乎计时器不起作用。 这里有什么问题吗?
您实际要做的是执行功能addInfosSinistreRecursive
并将返回值传递给setTimeout()
。 您实际要做的是传递一个函数引用。
一种方法是为这样的变量创建一个闭包:
function addInfosSinistreRecursive(msg, nbCalls) {
function timeoutHandler(){
if ($("#tab").hasClass('loaded') ) {
doSomething();
}else if (nbCalls < 10) {
nbCalls += 1;
setTimeout( timeoutHandler, 500 );
}
}
// first execution
timeoutHandler();
}
函数timeoutHandler()
可以将参数引用到addInfosSinistreRecursive()
,并且没有自己的参数。 因此,您可以setTimeout()
它的引用传递给setTimeout()
。
是的,这里肯定有问题。 您将立即调用该函数并将undefined
传递给setTimeout()
而不是为其提供要调用的函数。 这将做您想做的事情:
function addInfosSinistreRecursive(msg, nbCalls) {
if ($("#tab").hasClass('loaded')) {
doSomething();
}else if (nbCalls < 10) {
setTimeout(addInfosSinistreRecursive.bind(this, msg, nbCalls + 1), 500);
}
}
但是问题是为什么您要尝试这样做? 这似乎是一种复杂的方法,可以完成您要完成的所有任务。 选项卡更改时,您可能应该在某个地方使用事件,而不是递归循环并等待选项卡更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.