我有一个递归 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:超出最大调用堆栈大小(...)”
我如何防止这种情况并确保它运行直到完成?
问题就在这里:
setTimeout($scope.clickFilter(), 1000);
Putting ()
在函数引用之后意味着您希望该函数是called,立即,在代码中的该点。你可能想要的是这样的:
setTimeout($scope.clickFilter.bind($scope), 1000);
这将
- 将函数引用传递给
setTimeout()
,按要求,并且
- 确保以正确的方式调用该函数
this
值(什么.bind()
部分确实)
一旦你让它工作起来,术语“递归”就不太合适了。是的,函数在定时器到期后安排调用时正在引用自身,但它不是直接调用自身;它要求其他东西(计时器机制)稍后调用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)