为图表数据刷新器添加 JavaScript 闭包
Adding JavaScript closure to chart data refresher
这是一个脚本,可以为图表获取数据并每 30 秒重复一次该操作。问题是存在内存泄漏,一些研究告诉我我需要添加一个 JavaScript 闭包。但是,由于我对 JavaScript 不是很熟悉,所以我没能成功。
这是我上次尝试的结果:
fetch('log_chart.txt')
.then(function (response) {
return response.text();
})
.then(function (text) {
let series = csvToSeries(text);
renderChart(series);
setTimeout(trigger, 30000);
})
.catch(function (error) {
console.log(error);
});
function trigger() {
setTimeout(function (){
fetch('log_chart.txt')
.then(function (response) {
return response.text();
})
.then(function (text) {
let series = csvToSeries(text);
renderChart(series);
})
.catch(function (error) {
console.log(error);
}, 30000);
});
}
第一部分获取数据并渲染图表,同时设置为30秒后重复。第二部要重复上面的,不能停
问题是它在第二次更新后停止了 - 所以第二次 setTimeout
没有像我预期的那样工作。
我应该怎么做呢?
在这种情况下,您应该改用 setInterval
,它每 x 秒运行一次特定函数。它还应该解决您的内存泄漏问题,这可能是由使用 setTimeout
引起的,因为它是异步的,这意味着代码继续添加越来越多的 setTimeout
而仍然是 运行其他代码。这会占用不必要的内存。更多相关信息:How does setTimeout() create a memory leak in this code?
至于解决方案:
function trigger() {
fetch("log_chart.txt")
.then(function (response) {
return response.text();
})
.then(function (text) {
let series = csvToSeries(text);
renderChart(series);
})
.catch(function (error) {
console.log(error);
});
}
trigger()
setInterval(trigger, 30000)
这是一个脚本,可以为图表获取数据并每 30 秒重复一次该操作。问题是存在内存泄漏,一些研究告诉我我需要添加一个 JavaScript 闭包。但是,由于我对 JavaScript 不是很熟悉,所以我没能成功。
这是我上次尝试的结果:
fetch('log_chart.txt')
.then(function (response) {
return response.text();
})
.then(function (text) {
let series = csvToSeries(text);
renderChart(series);
setTimeout(trigger, 30000);
})
.catch(function (error) {
console.log(error);
});
function trigger() {
setTimeout(function (){
fetch('log_chart.txt')
.then(function (response) {
return response.text();
})
.then(function (text) {
let series = csvToSeries(text);
renderChart(series);
})
.catch(function (error) {
console.log(error);
}, 30000);
});
}
第一部分获取数据并渲染图表,同时设置为30秒后重复。第二部要重复上面的,不能停
问题是它在第二次更新后停止了 - 所以第二次 setTimeout
没有像我预期的那样工作。
我应该怎么做呢?
在这种情况下,您应该改用 setInterval
,它每 x 秒运行一次特定函数。它还应该解决您的内存泄漏问题,这可能是由使用 setTimeout
引起的,因为它是异步的,这意味着代码继续添加越来越多的 setTimeout
而仍然是 运行其他代码。这会占用不必要的内存。更多相关信息:How does setTimeout() create a memory leak in this code?
至于解决方案:
function trigger() {
fetch("log_chart.txt")
.then(function (response) {
return response.text();
})
.then(function (text) {
let series = csvToSeries(text);
renderChart(series);
})
.catch(function (error) {
console.log(error);
});
}
trigger()
setInterval(trigger, 30000)