SetTimeout递归函数(Javascript)

时间:2016-12-01 14:37:51

标签: javascript jquery recursion settimeout

我有一个递归的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");
    }
}

但是,当过滤器需要很长时间才能加载时,我会得到#34; Uncaught RangeError:超出最大调用堆栈大小(...)&#34;

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

1 个答案:

答案 0 :(得分:2)

问题在于:

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

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

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

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

一旦你开始工作,“递归”一词就不合适了。是的,当函数在计时器到期后安排调用时,函数会引用自身,但它并不直接调用自身;它要求别的东西(计时器机制)稍后再调用它。