javascript - setTimeout 和带参数的递归函数

标签 javascript recursion settimeout

我正在尝试做类似的事情:

我只想在选项卡加载类时调用 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()

关于javascript - setTimeout 和带参数的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25889950/

相关文章:

javascript - 为什么 window.open 在 setTimeout <= 1000ms 时不会被阻塞?

javascript - 如何获取 JSON POST 的结果

javascript - 删除字符串中不需要的部分。正则表达式/JS

javascript - 在 Docker 容器内运行时,NodeJS HTTPS 服务器通过 HTTP 而不是 HTTPS 提供服务

java - Java 中的递归,当方法调用自身之后有 return 语句时

jquery - Jquery 的 setTimeout 递归

javascript - 如何在 POSTMAN 上获得与浏览器相同的响应行为?

javascript - 是否有可能在循环中发生 “buffer” DOM 更改(以提高性能)?

recursion - 为什么此 F# 代码不是尾递归的?

java - 组合和排列算法(递归)