Javascript 将数据从一个函数更新到另一个函数

Javascript 将数据从一个函数更新到另一个函数,javascript,google-visualization,Javascript,Google Visualization,我正在使用GoogleCharts JS在我的网站上生成图表,我遇到了一个问题,无法从其他功能更新数据 下面是示例代码: google.setOnLoadCallback(test); function test() { chart = new google.visualization.DataTable(); chart.addColumn('string', 'Lorem'); chart.addColumn('number', 'Ipsum'); char

我正在使用GoogleCharts JS在我的网站上生成图表,我遇到了一个问题,无法从其他功能更新数据

下面是示例代码:

google.setOnLoadCallback(test);

function test() {
    chart = new google.visualization.DataTable();
    chart.addColumn('string', 'Lorem');
    chart.addColumn('number', 'Ipsum');
    chart.addRows([
            ['', 0]
    ]);
        var chartOptions = {};
    var chartCreate = new google.visualization.LineChart(document.getElementById('chartDiv'));
          chartCreate.draw(chart, chartOptions);
    ]);
}

function test2() {
    chart.addRows([
        ['Uno', 123],
        ['Dos', 233],
        ['Tres', 12],
        ['Quatro', 231]
    ]);
    chartCreate.draw(chart, chartOptions);
}

setTimeout(test2(),5000)
正如您所看到的,每隔5秒,我将在test2函数中有新的数据,我需要在函数测试中填充Google图表。我不想把整个测试函数放到test2函数中的原因是,它会每5秒启动一个新的图表实例,这有点占用内存,因为内存一直在增加

如果有一种方法可以在图表中添加新行,那就太好了,但根据谷歌的文档,添加行的唯一方法是每次重新绘制图表。

应该是:

setTimeout(test2, 5000)

setTimeout
的第一个参数是一个函数。您正在调用函数并将其结果(未定义,因为
test2()
不返回任何内容)传递给
setTimeout

setTimeout接受函数引用。在调用中,使用()调用函数。您只想传递函数的名称,以便setTimeout可以在以后(5秒后)调用它,如下所示:

setTimeout(test2, 5000)
函数测试的内部。这将确保在加载初始调用之前未设置计时器

另外,请确保在第一个函数中为图表变量指定“var”关键字,否则将创建一个全局变量(除非是有意的)


您将遇到范围问题,因为该方法需要全局变量。通过将所有内容包装在一个函数中,可以避免全局变量出现问题:

google.setOnLoadCallback(test);

function test() {
    var chart = new google.visualization.DataTable();
    chart.addColumn('string', 'Lorem');
    chart.addColumn('number', 'Ipsum');
    chart.addRows([
        ['', 0]
    ]);
    var chartOptions = {};
    var chartCreate = new google.visualization.LineChart(document.getElementById('chartDiv'));
    chartCreate.draw(chart, chartOptions);

    function test2() {
        chart.addRows([
            ['Uno', 123],
            ['Dos', 233],
            ['Tres', 12],
            ['Quatro', 231]
        ]);
        chartCreate.draw(chart, chartOptions);
    }

    setTimeout(test2, 5000);
}
setTimeout
将在5秒后调用
test2
,但不是每5秒调用一次。如果你想每5秒钟重复一次,你可以调用
setTimeout(test2500)
test2
函数的末尾,或者您可以使用
setInterval(test2,5000)取而代之

google.setOnLoadCallback(test);

function test() {
    var chart = new google.visualization.DataTable();
    chart.addColumn('string', 'Lorem');
    chart.addColumn('number', 'Ipsum');
    chart.addRows([
        ['', 0]
    ]);
    var chartOptions = {};
    var chartCreate = new google.visualization.LineChart(document.getElementById('chartDiv'));
    chartCreate.draw(chart, chartOptions);

    function test2() {
        chart.addRows([
            ['Uno', 123],
            ['Dos', 233],
            ['Tres', 12],
            ['Quatro', 231]
        ]);
        chartCreate.draw(chart, chartOptions);
    }

    setTimeout(test2, 5000);
}