【问题标题】:making variable global by window method does not work通过窗口方法使变量成为全局变量不起作用
【发布时间】: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


【解决方案1】:

你为什么不在你的函数之外声明你的变量并给出一个虚拟值

var chartglobal = "dummy";
$(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);
   chartglobal = chart;

 console.log(chart);
 };
//as @Artur Filipiak sais at this point variable is not setted yet. so should print "dummy"
 console.log(chartglobal);

【讨论】:

  • as @Artur Filipiak sais at this point variable is not setted yet OP 使用的是async: false, 所以关于发布的代码,应该定义它
  • @A.Wolf 变量在console.log 带有虚拟值时定义。这样他就可以找到出路
  • 我猜 OP 不想要一个虚拟值,而是在 ajax 成功回调中设置的值
猜你喜欢
  • 2021-11-14
  • 2013-07-13
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2016-12-30
相关资源
最近更新 更多