【问题标题】:Return data from jQuery.post AJAX call?从 jQuery.post AJAX 调用返回数据?
【发布时间】:2012-04-11 22:57:59
【问题描述】:

嗨,我正在调用这个函数:

function getCoordenadas()
{
    var coordenadas = new Array();
    $.post(
        '<?=$this->baseUrl('user/parse-kml')?>', 
        { kmlName: "esta_chica.kml"},
        function(jsonCoord) {
            jQuery.each(jsonCoord, function(i, val) {
                var latlng = val.split(',');
                coordenadas.push(new google.maps.LatLng(latlng[0], latlng[1]));
            });
        },
        'json'
    );  
    return coordenadas;
}

像这样:

$(document).ready(function(){
    $('.caller').click(function() {
        console.log(getCoordenadas());
    });
});

因此,当您单击 .caller 时,它会调用函数获取数据正确填充数组,但 console.log(getCoordenadas());输出 []。

如果我将数组声明 (var coordenadas = new Array();) 从函数范围移动以使其成为全局,当我第一次单击 .caller 时 console.log(getCoordenadas());输出[],但第二次正确输出数组。有什么想法吗?

提前致谢

【问题讨论】:

标签: javascript jquery ajax arrays return


【解决方案1】:

此函数异步工作。 AJAX 发布被触发,然后函数返回而不等待 AJAX 调用完成。这就是coordenadas 数组为空的原因。

当您将其设为全局时,第一次它仍然是空的,而在您第二次尝试时,ajax 返回并填充了数组。您应该重组代码以使用回调。像这样的:

// definition
function getCoordenadas(callback)
{
    var coordenadas = new Array();
    $.post(
        '<?=$this->baseUrl('user/parse-kml')?>', 
        { kmlName: "esta_chica.kml"},
        function(jsonCoord) {
            jQuery.each(jsonCoord, function(i, val) {
                var latlng = val.split(',');
                coordenadas.push(new google.maps.LatLng(latlng[0], latlng[1]));
            });
            callback(coordenadas);
        },
        'json'
    );  
}

// usage
$(document).ready(function(){
    $('.caller').click(function() {
      getCoordenadas(function(coord) {
        console.log(coord);
      })
    });
});

【讨论】:

  • Jajaja,我怀疑。感谢您的确认!
【解决方案2】:

如果你需要一个完整的函数,你不能使用$.post函数;

您需要直接调用$.ajax 函数。 您传递一个选项对象,该对象可以具有“成功”、“错误”和“完成”回调。

而不是这个:

$.post(<?=$this->baseUrl('user/parse-kml')?>, parameters, function);

你会用这个:

$.ajax({
    url: <?=$this->baseUrl('user/parse-kml')?>,
    type: "POST",
    data: parameters,
    success: successFunction,
    error: errorFunction,
    complete: completefunction

});

还有很多其他选项可用。 The documentation 列出了所有可用的选项。

【讨论】:

  • 谢谢,这种方法更适合我的需要
猜你喜欢
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多