获取 JSON 数据后无法保留变量
Unable to hold onto variable after fetching JSON data
我正在使用 highstocks 图表库和 JQuery 来解决这个问题。我正在尝试创建一个分成三块的图表,每块都有一组不同的数据。为了读入数据,我使用了来自 highstock 网站的示例,代码如下:
var seriesOptions = [],
names = ['MSFT', 'AAPL', 'GOOG'];
$.each(names, function(i, name) {
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=' + name.toLowerCase() + '-c.json&callback=?', function(data) {
seriesOptions[i] = {
name: name,
data: data
};
});
});
处理此代码后,我使用 seriesOptions
变量作为三个图表中每个图表的系列值:
$('#container').highcharts('StockChart', {
// misc options
series: [
seriesOptions[0],
seriesOptions[1],
seriesOptions[2],
]
}
不过,似乎seriesOptions变量在$.getJSON()
方法调用出来后是null
。我怎样才能解决这个问题,$.getJSON()
调用后 seriesOptions
变量发生了什么?
谢谢
编辑:具体错误:
Uncaught TypeError: Cannot read property 'type' of undefined
。我很确定这是指 seriesOptions
变量,但为了清楚起见,我将其包括在内。
您可能在 AJAX 调用完成之前执行了 highCharts
调用。您还在循环中进行 AJAX 调用(尽管是一个小循环,但它仍然可能存在相同的一般问题)-如果您 可以 - 尝试将此设为 1 AJAX 调用所有参数。如果那不是一个选项 - 您可以循环并验证所有调用是否已完成,然后处理:
var seriesOptions = [],
names = ['MSFT', 'AAPL', 'GOOG'];
var completedCalls = 0;
for (var i = 0; i < names.length; i++) {
var name = names[i];
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=' + name.toLowerCase() + '-c.json&callback=?', function(data) {
seriesOptions.push({
name: name,
data: data
});
completedCalls++;
if (completedCalls == names.length) {
//All ajax calls done, do highcharts magic!
$('#container').highcharts('StockChart', {
// misc options
series: [
seriesOptions[0],
seriesOptions[1],
seriesOptions[2],
]
})
}
});
}
jQuery 提供了一个使用 $.when
的接口,用于使用 deferred/promise 对象解析多个 ajax 调用。下面是使用您的配置的示例。
var seriesOptions = [];
$.when(
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=msft-c.json&callback=?'),
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?'),
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=goog-c.json&callback=?')
).done(function (r1, r2, r3) {
seriesOptions.push({
name: "MSFT",
data: r1
});
seriesOptions.push({
name: "AAPL",
data: r2
});
seriesOptions.push({
name: "GOOG",
data: r3
});
$('#container').highcharts('StockChart', {
// misc options
series: [
seriesOptions[0],
seriesOptions[1],
seriesOptions[2],
]
});
});
我正在使用 highstocks 图表库和 JQuery 来解决这个问题。我正在尝试创建一个分成三块的图表,每块都有一组不同的数据。为了读入数据,我使用了来自 highstock 网站的示例,代码如下:
var seriesOptions = [],
names = ['MSFT', 'AAPL', 'GOOG'];
$.each(names, function(i, name) {
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=' + name.toLowerCase() + '-c.json&callback=?', function(data) {
seriesOptions[i] = {
name: name,
data: data
};
});
});
处理此代码后,我使用 seriesOptions
变量作为三个图表中每个图表的系列值:
$('#container').highcharts('StockChart', {
// misc options
series: [
seriesOptions[0],
seriesOptions[1],
seriesOptions[2],
]
}
不过,似乎seriesOptions变量在$.getJSON()
方法调用出来后是null
。我怎样才能解决这个问题,$.getJSON()
调用后 seriesOptions
变量发生了什么?
谢谢
编辑:具体错误:
Uncaught TypeError: Cannot read property 'type' of undefined
。我很确定这是指 seriesOptions
变量,但为了清楚起见,我将其包括在内。
您可能在 AJAX 调用完成之前执行了 highCharts
调用。您还在循环中进行 AJAX 调用(尽管是一个小循环,但它仍然可能存在相同的一般问题)-如果您 可以 - 尝试将此设为 1 AJAX 调用所有参数。如果那不是一个选项 - 您可以循环并验证所有调用是否已完成,然后处理:
var seriesOptions = [],
names = ['MSFT', 'AAPL', 'GOOG'];
var completedCalls = 0;
for (var i = 0; i < names.length; i++) {
var name = names[i];
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=' + name.toLowerCase() + '-c.json&callback=?', function(data) {
seriesOptions.push({
name: name,
data: data
});
completedCalls++;
if (completedCalls == names.length) {
//All ajax calls done, do highcharts magic!
$('#container').highcharts('StockChart', {
// misc options
series: [
seriesOptions[0],
seriesOptions[1],
seriesOptions[2],
]
})
}
});
}
jQuery 提供了一个使用 $.when
的接口,用于使用 deferred/promise 对象解析多个 ajax 调用。下面是使用您的配置的示例。
var seriesOptions = [];
$.when(
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=msft-c.json&callback=?'),
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?'),
$.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=goog-c.json&callback=?')
).done(function (r1, r2, r3) {
seriesOptions.push({
name: "MSFT",
data: r1
});
seriesOptions.push({
name: "AAPL",
data: r2
});
seriesOptions.push({
name: "GOOG",
data: r3
});
$('#container').highcharts('StockChart', {
// misc options
series: [
seriesOptions[0],
seriesOptions[1],
seriesOptions[2],
]
});
});