【发布时间】:2016-09-29 10:18:23
【问题描述】:
在寻找其他使变量成为全局变量的答案后,我苦苦挣扎了一段时间,它看起来很简单,但似乎不起作用。
我的代码从 CSV 文件中获取数据并返回一个名为“chart”的变量,其中包含一个数组。此 Array 变量将在 Highchart 图中的函数外部使用。 (本地返回的Array是正确的)
我试图通过将变量附加为窗口的属性来使函数内部的变量“全局”。像这样:turn javascript local variable into global variable
但在我的代码中这行不通:
$(document).ready(function() {
$.ajax({
type: "GET",
url: "data/data.csv",
async: false,
dataType: "text",
success: function(data) {processData(data);}
});
});
function processData(data) {
var table = data.split("\n").map(line => line.split(","));
var categories = table[0].slice(2).map(e=>e*1);
data = table.slice(1).map(a => ({"name": a[0], "id": parseInt(a[1]), "data": a.slice(2).slice(0).map(e=>e*1)}));
var lengthdata = data.length - 1;
var chart = data.splice(0, lengthdata);
window.chartglobal = chart;
console.log(chart);
};
console.log(chartglobal);
我在这里遗漏了什么,或者有没有比窗口选项更好的方法来解决 mmy 的具体情况?
编辑:
代码用于传单,其中数据使用 map.on 和标记 ID 连接到传单标记。这种方式并不重要,调用 ajax 请求是一个伪就绪事件,它在尝试获取全局值后被触发。我不知道将 async 更改为“true”会发生什么变化,但无论哪种方式都可以。
该变量在 map.on 中使用如下:
map.on('popupopen', function(e) {
var marker = e.popup._source.feature.id;
var search = function(name) {
for(var key in chartglobal) {
if(chartglobal[key].id === name) {
return chartglobal[key];
}}};
var outputhighchart = search(marker);
var chartdef = [];
chartdef.push(outputhighchart);});
由于 ajax 调用,console.log 没有记录,问题出在 map.on 的某个地方,我因为关注全局变量而忽略了它。感谢您帮助我并以正确的方式指导。
【问题讨论】:
-
async: false,真是个坏主意…… -
Ups...我错过了
async: false:-) -
您的问题是因为您在 ajax 回调中设置它,但在您尝试获取全局值后触发的伪就绪事件中调用 ajax 请求。将所有代码包装在文档就绪处理程序中,或者最好停止使用同步 ajax 请求,但使用相关回调来设置任何逻辑...
-
@ A. Wolff,谢谢,请参阅我的编辑,全局变量工作正常。但是由于关于 ready 事件的评论,我发现 console.log 无法工作,问题出在 map.on 的某个地方,并且有一个愚蠢的 }) 错字。代码现在可以工作了。
标签: javascript jquery arrays ajax leaflet