setTimeout和带参数的递归函数
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()
。
是的,这里肯定有问题。您立即调用该函数并将undefined
传递给setTimeout()
,而不是给它一个要调用的函数。这将做你想做的事情:
function addInfosSinistreRecursive(msg, nbCalls) {
if ($("#tab").hasClass('loaded')) {
doSomething();
}else if (nbCalls < 10) {
setTimeout(addInfosSinistreRecursive.bind(this, msg, nbCalls + 1), 500);
}
}
但问题是你为什么要这么做?这似乎是一种复杂的方式来做你想要完成的事情。当选项卡更改时,您可能应该在某个地方使用事件,而不是递归地循环并等待选项卡更改。
相关文章:
- 递归函数中断
- 将jQuery对象传递到setTimeout递归函数中
- 对象与递归函数的比较
- 循环内部的递归函数未按预期工作
- 递归函数返回不正确
- 递归函数编程困境
- 给定一个带有数字的数组,我如何编写一个递归函数,当 2 个元素加起来为一个目标时,它会在数组中查找索引
- 返回不会退出 javascript 中的递归函数
- jquery递归函数转换为非递归函数
- AngularJS,promise带有递归函数
- 如何停止此递归函数
- 如何检查传递到递归函数的参数是否是数组的元素
- 将参数传递给递归函数javaScript
- setTimeout和带参数的递归函数
- 递归函数中的参数串联
- bind函数递归传递参数失败
- 使用Javascript的具有两个参数的非递归函数
- 理解递归函数的解构参数
- JS将数组作为参数传递给递归函数
- 递归函数(插件?)与不断变化的参数,直到达到数(jQuery)