我得到了错误:太多的递归.为什么呢?
I get the error: too much recursion. Why is that?
我有一个函数来刷新页面上的图形。其思想是,它不断循环并刷新一个名为salt
的变量。变量定义在一个单独的文件中,分别称为path
、displayTimeFrom
、selectedTimeRangeType
和target
。下面是循环代码,它也响应GUI中的更改:
$(function () {
refreshGraphs();
});
var refreshGraphs = function () {
d = new Date();
var graphiteUrl = graphs.path + "render/?_salt" + d.getTime()
+ "&from=-" + graphs.displayTimeFrom
+ graphs.selectedTimeRangeType
+ "&minXStep=0"
+ "&until=now&height=800&";
$('#graph-middle').prop("src", graphiteUrl + graphs.target);
setIntervalAndExecute(refreshGraphs, 30000); // refresh every 30000 milliseconds aka every 30 seconds
// Execute immediately and after the interval (setInterval only starts after certain amount of time)
function setIntervalAndExecute(fn, t) {
fn();
return (setInterval(fn, t));
}
// Change graph to chosen value
$('#graph-middle').on('click', '#displayTimeFrom', function () {
graphs.displayTimeFrom = $(this).text();
refreshGraphs();
});
$('#graph-middle').on('click', '#selectedTimeRangeType', function () {
graphs.selectedTimeRangeType = $(this).text();
refreshGraphs();
});
};
当我运行它时,它显示"too much recursion"
。为什么会这样,我该如何解决它?
您的refreshGraphs()
函数每次运行时都会立即调用自己(通过setIntervalAndExecute()
)。
有两点需要注意:
1. 你正在递归地调用refreshGraphs()
。
2. 您已经在refreshGraphs()
函数中放置了click
处理程序。
因此,无论何时调用refreshGraphs()
,它都将再次绑定click
事件,而不会取消前一个事件的绑定。您必须取消绑定前一个,或者您可以将它们放在$(function () {})
中。
试试这些。
$(function () {
refreshGraphs();
// Change graph to chosen value
$('#graph-middle').on('click', '#displayTimeFrom', function () {
graphs.displayTimeFrom = $(this).text();
refreshGraphs();
});
$('#graph-middle').on('click', '#selectedTimeRangeType', function () {
graphs.selectedTimeRangeType = $(this).text();
refreshGraphs();
});
});
var refreshGraphs = function () {
d = new Date();
var graphiteUrl = graphs.path + "render/?_salt" + d.getTime()
+ "&from=-" + graphs.displayTimeFrom
+ graphs.selectedTimeRangeType
+ "&minXStep=0"
+ "&until=now&height=800&";
$('#graph-middle').prop("src", graphiteUrl + graphs.target);
setIntervalAndExecute(refreshGraphs, 30000); // refresh every 30000 milliseconds aka every 30 seconds
// Execute immediately and after the interval (setInterval only starts after certain amount of time)
function setIntervalAndExecute(fn, t) {
fn();
return (setInterval(fn, t));
}
};
或
$(function () {
refreshGraphs();
});
var refreshGraphs = function () {
d = new Date();
var graphiteUrl = graphs.path + "render/?_salt" + d.getTime()
+ "&from=-" + graphs.displayTimeFrom
+ graphs.selectedTimeRangeType
+ "&minXStep=0"
+ "&until=now&height=800&";
$('#graph-middle').prop("src", graphiteUrl + graphs.target);
setIntervalAndExecute(refreshGraphs, 30000); // refresh every 30000 milliseconds aka every 30 seconds
// Execute immediately and after the interval (setInterval only starts after certain amount of time)
function setIntervalAndExecute(fn, t) {
fn();
return (setInterval(fn, t));
}
// Change graph to chosen value
$('#graph-middle').off('click').on('click', '#displayTimeFrom', function () {
graphs.displayTimeFrom = $(this).text();
refreshGraphs();
});
$('#graph-middle').off('click').on('click', '#selectedTimeRangeType', function () {
graphs.selectedTimeRangeType = $(this).text();
refreshGraphs();
});
};
解决方案是在匿名函数中调用jQuery,而不是在refreshgraphs命名空间中调用。问题解决了。
相关文章:
- 为什么递归生成器函数没有't在ES2015工作
- 为什么setTimeout适用于无休止的递归调用
- 为什么在论证部分是发生乘法(递归)
- 为什么可以't使用振荡器的递归单宁性质来创建音乐定序器
- 为什么jQueryExtend无法递归复制这两个对象文字
- 为什么这个递归的javascript函数返回它的作用
- 为什么递归单词搜索求解器缺少五个单词,却找到了其他 47 个单词
- 为什么我在下面的递归函数中得到“X 不是函数”
- 为什么这个递归的javascript函数不返回正确的值
- 为什么 jQuery 扩展深拷贝不递归复制对象
- 为什么我达到了 $digest () 迭代?如何跟踪递归脚本的活动
- 为什么我的递归函数调用没有返回值
- 为什么 setTimeout 会阻止递归 $http.get 调用
- 为什么"requestAnimationFrame”;递归获胜'不要占用RAM
- 为什么不能递归调用jquery中的函数
- 为什么这个递归算法在JS中不起作用?
- 为什么新版本的jQuery不能使用这种递归?
- 这个递归函数是如何解析的,为什么它输出它所做的
- 为什么有这么多递归
- 我得到了错误:太多的递归.为什么呢?