SetTimeout 递归函数(Javascript)超出最大调用堆栈大小

IT技术 javascript jquery recursion settimeout
2021-02-26 21:55:37

我有一个递归 SetTimeout 函数,它在过滤器加载后单击我页面上的过滤器(它们是通过 Ajax 加载的,因此在页面加载时无法立即使用)。

$scope.clickFilter = function () {
    var filter = $('.filter-item')
        .find('input[value="' + $scope.activeFilter + '"]');

    if (filter.length < 1) {
        setTimeout($scope.clickFilter(), 1000);
    } else {
        $(filter).trigger("click");
    }
}

但是,当过滤器需要很长时间才能加载时,我会收到“Uncaught RangeError: Maximum call stack size exceeded(...)”

我如何防止这种情况并确保它运行直到完成?

1个回答

问题在这里:

  setTimeout($scope.clickFilter(), 1000); 

放在()函数引用之后意味着您希望在代码中的那个点立即调用该函数你可能想要的是:

  setTimeout($scope.clickFilter.bind($scope), 1000);

这将

  • setTimeout()根据需要将函数引用传递给,并且
  • 确保将使用正确的this调用该函数(该.bind()部分做什么

一旦你让它工作,“递归”这个词就不太合适了。是的,该函数在定时器到期后安排调用时正在引用自身,但它不是直接调用自身;它要求其他东西(计时器机制)稍后调用它。

知道这是重复的... :-)
2021-04-17 21:55:37
@TJCrowder 有时早上我无法处理奇怪的 SO 搜索。是的,这当然是重复的。
2021-05-13 21:55:37