尝试在脚本上运行时,Array变为空

时间:2015-01-29 14:14:17

标签: javascript arrays

我有一个javascript,在ajax调用进程获得某个值后,将其存储在数组中。我不知道为什么,但我将我的数组设置为全局变量,但当我尝试在另一个函数上调用它时,长度返回0;

为什么当我尝试使用不同的函数获取数组的长度时它返回零?但是当我在第一个函数的for循环之后包含它时,它可以正确生成长度吗?当你将变量声明为GLOBAL时,它是否意味着你可以在任何地方和任何函数中使用它?请帮助我,让我意识到自己的错误。

对不起,这是一个新手,这是实际的代码:

var distMatLink = [];

function searchNearMarkers(distance){
    clearLocations();
    document.getElementById('errorNotifs').innerHTML = "";
    //document.getElementById('checkboxes').innerHTML = '';     
    var searchUrl = '...some url here...'
    downloadUrl(searchUrl, function(data){
        var xml = parseXml(data);
        var markerNodes = xml.documentElement.getElementsByTagName("marker");
        var bounds = new google.maps.LatLngBounds();
        for (var i = 0; i < markerNodes.length; i++){
            var name = markerNodes[i].getAttribute("name");
            var address = markerNodes[i].getAttribute("address");
            var info = markerNodes[i].getAttribute("info");
            var budget = markerNodes[i].getAttribute("budget");
            var tts = markerNodes[i].getAttribute("tts");
            var type = markerNodes[i].getAttribute("type");
            var distance = markerNodes[i].getAttribute("distance");
            var latlng = new google.maps.LatLng(
                parseFloat(markerNodes[i].getAttribute("lat")),
                parseFloat(markerNodes[i].getAttribute("lng")));
            storeArray (i,markerNodes[i].getAttribute("lat"),markerNodes[i].getAttribute("lng"));
            bounds.extend(latlng);
            if (i == (markerNodes.length - 1)){
                bounds.extend(userPosLatLng);
            }
        }
        map.fitBounds(bounds);

    });

    countArray();
}

function storeArray(i,lat,lng){
      distMatLink[i] = "|"+lat+ "," +lng+""; 
}

function countArray(){
      alert(distMatLink.length);
}

2 个答案:

答案 0 :(得分:0)

作为一名评论者提到,Ajax异步执行此操作。要修复此功能,您必须执行以下操作:

function createMe(result){
    for(var i = 0; i < 10; i++){
       someArray[i] = i;
       if(i == 9){
          result(someArray)
       }
    }
}

function countMe(){
   createMe(function(results){
      alert(results)
   })
}

原因是Ajax在循环结束之前运行了countMe()函数,因此你的数组看起来是空的。上述函数使用回调来确保在继续完成countMe()之前完成该功能。现在不使用createMe初始化,而是使用countMe,当CreatMe完成时,countMe将提醒结果。

答案 1 :(得分:0)

您最有可能遇到的问题是,即使在.length请求完成之前,您仍在执行AJAX功能。您必须在AJAX请求的回调中设置全局变量。

使用jQuery时与这些行类似的东西:

$.ajax({
    url: url,
    success: function(responseData, status){
        if(status == 'success') {
            myglobalarray = parse(responseData);
        }
    }
});

如果使用普通Javascript

,则与这些行类似
xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4 && xmlhttp.status==200) {
     myglobalarray = parse(xmlhttp.responseText);
  }
}