$ ajax请求无法保存到数组中(未定义)

时间:2011-12-07 15:33:01

标签: javascript jquery ajax json

我已经完成了这个功能:

    function fetchGeo(){

var geoInfo = new Array();
 var counter = 0;


  $.ajax({
  url: 'www.URL.com/req.php',
  dataType: 'json',
  data: 'action=load',
   success: function(data){
   //console.log(data);
   $.each(data, function(i,geo){

    geoInfo[i] = new Array(geo.lat,geo.long,geo.time);
  //console.log(geoInfo);  
   });
   return geoInfo;
  }
});
}


var geoInfo = fetchGeo();

每次执行此函数时,我都无法将数据放入脚本中的其他位置。

我已经找到了这个,但这对我来说也是失败的:Wait for .each() .getJSON request to finish before executing a callback

5 个答案:

答案 0 :(得分:1)

那是因为你没有从fetchGeo函数返回任何内容,而是从匿名成功处理程序返回它,并且在 fetchGeo函数结束后发生。 / p>

使用回调来处理结果:

function fetchGeo(callback) {
  $.ajax({
    url: 'www.URL.com/req.php',
    dataType: 'json',
    data: 'action=load',
    success: function(data){
      var geoInfo = [];
      $.each(data, function(i,geo){
        geoInfo.push([geo.lat,geo.long,geo.time]);
      });
      callback(geoInfo);
    }
  });
}

fetchGeo(function(geoInfo){
  // here you can use the data
});

答案 1 :(得分:0)

geoInfo数组的范围是fetchGeo函数的本地范围。在.each中创建的匿名函数无法看到该数组。将geoInfo数组移动到更高的范围,例如fetchGeo函数之外。

答案 2 :(得分:0)

ajax本质上是异步的。在从函数返回之前,ajax还没有完成执行请求,所以无论你返回的是一个空数组。

您可以尝试将geoInfo声明为全局变量,或者在可以访问它的函数的外观中尝试这样的事情。

var geoInfo = new Array();

function fetchGeo(){

 var counter = 0;


  $.ajax({
  url: 'www.URL.com/req.php',
  dataType: 'json',
  data: 'action=load',
   success: function(data){
   //console.log(data);
   $.each(data, function(i,geo){

    geoInfo[i] = new Array(geo.lat,geo.long,geo.time);
    //console.log(geoInfo);  
   });
  }
});
}


fetchGeo();

答案 3 :(得分:0)

成功的事情是asynchronius(因此名称为AJAX)。这意味着geoInfo数组不可用。如果你把它从范围中提升到全局水平,那就可以了。

var geoInfo = new Array();
function fetchGeo() {
    var counter = 0;
    $.ajax({
        url: 'www.URL.com/req.php',
        dataType: 'json',
        data: 'action=load',
        success: function(data){
            //console.log(data);
            $.each(data, function(i,geo){
                geoInfo[i] = new Array(geo.lat,geo.long,geo.time);
                //console.log(geoInfo);  
            });
        }
    });
}

fetchGeo();

答案 4 :(得分:0)

这样的事情应该会有所帮助:

$.ajax({
    ...
    success: function (data) {
        var geoInfo = [];
        $.each(data, function (i, geo) {
            geoInfo.push([geo.lat, geo.long, geo.time]);
        });
        // Call the the function which relies on `geoInfo`
        testFunction(geoInfo);
    }
    ...
});

function testFunction(geoArr) {
    // 'geoArr' is available for processing
}