可能重复:
Passing functions to setTimeout in a loop: always the last value?
我知道我需要使用闭包来处理问题,但我不确定如何; 我有功能,从服务器获取数据:
function loadGraph(chartDataStreams) { //length of chartDataStreams is two
initCharts(); //init charts area
for (c in chartDataStreams) {
var chartData = [];
alert(c); // says : 0, then 1
getDataFromServer(chartDataStreams[c].x, chartDataStreams[c].y,function (data) {
for (d in data.datapoints) {
var item = { date: new Date(data.datapoints[d].at), value:data.datapoints[d].value };
chartData.push(item);
}
alert(c); // says: 1 then 1
updateGraphData(chartData);
});
}
}
在这个函数中,我需要调用updateGraphData,它使用chartData更新图形数据提供程序。问题是在chartData中我不仅有实际数据,还有前一个循环周期的数据。我认为这是使用闭包的正确位置,但我不确定如何......你有什么想法吗?
// edit:我在getDataFromServer函数之外错误地输入了chartData的声明,但是我还有一个问题:检查编辑过的代码。从第二个警报我想说0和1,而不仅仅是1,1
答案 0 :(得分:1)
在回调中实例化chartData
而不是在外面。
function loadGraph(chartDataStreams) {
initCharts();
for (c in chartDataStreams) {
getDataFromServer(chartDataStreams[c].x, chartDataStreams[c].y, function (data) {
var chartData = []; // RIGHT HERE
for (d in data.datapoints) {
var item = {
date: new Date(data.datapoints[d].at),
value: data.datapoints[d].value
};
chartData.push(item);
}
updateGraphData(chartData);
});
}
}
这样,每个回调在调用时都会获得自己的新chartData
数组。
块不在JavaScript中创建变量范围,只创建函数,因此外部chartData
的范围限定为外部函数,并且每次循环迭代都会覆盖。
它的最后一次覆盖是所有回调在最终被调用时使用的内容,因此所有数据都在该共享数组中结束。