我有一个递归的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;
如何防止这种情况并确保它一直运行直到完成?
答案 0 :(得分:2)
问题在于:
setTimeout($scope.clickFilter(), 1000);
在函数引用之后放置()
意味着您希望函数在代码中的那一点立即被调用。你可能想要的是:
setTimeout($scope.clickFilter.bind($scope), 1000);
将
setTimeout()
,并this
值调用该函数(.bind()
部分的作用)一旦你开始工作,“递归”一词就不合适了。是的,当函数在计时器到期后安排调用时,函数会引用自身,但它并不直接调用自身;它要求别的东西(计时器机制)稍后再调用它。