繁体   English   中英

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()它的引用传递给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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM