添加警报时Javascript工作

添加警报时Javascript工作,javascript,Javascript,在javascript程序中,我试图填充一个全局3属性数组 对象从文件中的数据。该计划未能成功实施 我尝试过调试,但发现在使用Firefox的 内部调试器。所以我试着用萤火虫,但萤火虫僵住了。 回到简单的“警报”插入,我发现添加 “警报”生成了成功的运行,但带有令人费解的“警报”消息- 在数组创建子例程中,数组长度似乎正常,但是 常规之外的零。大概我做错了什么,但是 mm对这种行为感到困惑,所以转向这里寻求帮助(作为第一次用户)。 正在使用FWIW JQuery读取数据。以下是该计划的要点: v

在javascript程序中,我试图填充一个全局3属性数组 对象从文件中的数据。该计划未能成功实施 我尝试过调试,但发现在使用Firefox的 内部调试器。所以我试着用萤火虫,但萤火虫僵住了。 回到简单的“警报”插入,我发现添加 “警报”生成了成功的运行,但带有令人费解的“警报”消息- 在数组创建子例程中,数组长度似乎正常,但是 常规之外的零。大概我做错了什么,但是 mm对这种行为感到困惑,所以转向这里寻求帮助(作为第一次用户)。 正在使用FWIW JQuery读取数据。以下是该计划的要点:

var nodedata = new Array();
nodedata = [];
// use routine to fill array
requestNodeData();
alert('POST requestNodeData nodedata.length=' + nodedata.length);
// create markers
for (var index in nodedata) addMarker(nodedata[index], index);
alert('POST index Loop nodedata.length=' + nodedata.length);
  ...

function requestNodeData() {
  var formData = $('#form').serialize();
  $.post('/cgi-bin/get_nodedata.cgi', formData, processNodeData, 'text').error(processNodeDataError);
  return false; // this prevents form button submission
}

function processNodeData(data) {
  var strings = new Array(3);
  datalines = data.split(/\n/);
  for (var i = 0; i < (datalines.length); i++) {
    strings = datalines[i].split(/,/);
    nodedata[i] = {
      'lat': strings[0],
      'lng': strings[1],
      'name': strings[2]
    };
  }
  alert('END OF requestNodeData nodedata.length=' + nodedata.length);
}
var nodedata=new Array();
nodedata=[];
//使用例程填充数组
requestNodeData();
警报('POST requestNodeData nodedata.length='+nodedata.length');
//创建标记
对于(nodedata中的var索引)addMarker(nodedata[index],index);
警报('POST index Loop nodedata.length='+nodedata.length);
...
函数requestNodeData(){
var formData=$('#form').serialize();
$.post('/cgi-bin/get_-nodedata.cgi',formData,processNodeData,'text')。错误(processNodeData错误);
return false;//这将阻止表单按钮提交
}
函数processNodeData(数据){
变量字符串=新数组(3);
datalines=data.split(/\n/);
对于(变量i=0;i<(datalines.length);i++){
字符串=数据线[i]。拆分(/,/);
野田[i]={
“lat”:字符串[0],
“lng”:字符串[1],
“名称”:字符串[2]
};
}
警报('requestNodeData的末尾nodedata.length='+nodedata.length);
}

注: “请求结束节点数据”警报始终给出预期的数组大小 添加“POST requestNodeData”警报可使程序成功运行! 但是数组大小是“0”,而不是预期的数组大小!? 如果省略了“POST requestNodeData”警报,“POST索引循环”给出0
但是在包含该警报时给出了预期的数组大小

Ajax请求是异步的,因此您不能在调用之后处理它的结果。 alert“帮助”您,只是因为它在执行之后暂停了所有内容,在这段时间内,ajax成功结束,end填充了您的变量。
因此,您应该对nodedata进行任何处理,just-in-success回调

Ajax请求是异步的,因此您不能在调用之后处理结果。 alert“帮助”您,只是因为它在执行之后暂停了所有内容,在这段时间内,ajax成功结束,end填充了您的变量。
因此,您应该对nodedata执行任何操作,只要在成功回调中,您正在使用AJAX请求检索数据。默认情况下,此请求是异步的。发生的情况是,您正在执行
requestNodeData()
。这将设置ajax请求并将其发送到服务器。但是,脚本将立即继续,并以异步方式处理从ajax请求返回的数据

长话短说。它将执行:

requestNodeData();
for (var index in nodedata) addMarker(nodedata[index], index);

... (some time goes by) ...

and when the data from requestNodeData is ready,
it'll execute processNodeData(data)
使用
alert
将暂停脚本(但显然不是ajax请求),这将“及时”填充变量。因此,通常最好使用
console.log
来防止警报中断应用程序的流程


要解决此问题,请使用方法而不是jQuery.post(),并将“async”设置为false,如下所示:

$.ajax({
  type: "POST",
  url: '/cgi-bin/get_nodedata.cgi',
  data: formData,
  success: processNodeData,
  dataType: 'text',
  async: false
});

这将导致脚本“按顺序”执行脚本。

您正在使用AJAX请求检索数据。默认情况下,此请求是异步的。发生的情况是,您正在执行
requestNodeData()
。这将设置ajax请求并将其发送到服务器。但是,脚本将立即继续,并以异步方式处理从ajax请求返回的数据

长话短说。它将执行:

requestNodeData();
for (var index in nodedata) addMarker(nodedata[index], index);

... (some time goes by) ...

and when the data from requestNodeData is ready,
it'll execute processNodeData(data)
使用
alert
将暂停脚本(但显然不是ajax请求),这将“及时”填充变量。因此,通常最好使用
console.log
来防止警报中断应用程序的流程


要解决此问题,请使用方法而不是jQuery.post(),并将“async”设置为false,如下所示:

$.ajax({
  type: "POST",
  url: '/cgi-bin/get_nodedata.cgi',
  data: formData,
  success: processNodeData,
  dataType: 'text',
  async: false
});

这将导致脚本“按顺序”执行脚本。

将代码包装在中。准备将代码包装在中。ReadyTanks可获得解决问题的详细帮助。显然,我不习惯使用异步进程。PS:我想补充一点,我和代码一样欣赏详细的解释,因为它让我对使用这种异步进程的代码的工作原理有了一些了解。顺便说一句,我仍然感到困惑的是,警报是按照我预期的顺序出现的,没有显示任何异步性,我没有想到这种可能性——首先出现了“请求结束节点数据”警报(预期数组长度),然后出现了“请求后节点数据”警报(数组长度iof为0),感谢您的详细帮助,解决了问题。显然,我不习惯使用异步进程。PS:我想补充一点,我和代码一样欣赏详细的解释,因为它让我对使用这种异步进程的代码的工作原理有了一些了解。顺便说一句,我仍然感到困惑的是,警报是按照我预期的顺序出现的,没有显示任何异步性,我没有想到这种可能性,即首先出现了“请求结束节点数据”警报(具有预期的数组长度),然后出现了“请求后节点数据”警报(数组长度为iof 0)