我得到了错误:太多的递归.为什么呢?

I get the error: too much recursion. Why is that?

本文关键字:递归 为什么呢 太多 错误      更新时间:2023-09-26

我有一个函数来刷新页面上的图形。其思想是,它不断循环并刷新一个名为salt的变量。变量定义在一个单独的文件中,分别称为pathdisplayTimeFromselectedTimeRangeTypetarget。下面是循环代码,它也响应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命名空间中调用。问题解决了。