jQuery异步ajax查询和返回值问题(范围、结束)

jQuery异步ajax查询和返回值问题(范围、结束),jquery,ajax,scope,closures,Jquery,Ajax,Scope,Closures,由于异步查询和变量范围问题,代码无法工作。我不明白怎么解决这个问题。使用async:false更改为$.ajax方法-不是选项。我知道闭包,但我如何在这里实现它——我不知道。我在这里看到了关于js和jQuery异步问题中闭包的所有主题,但仍然没有看到任何内容。请帮忙。 代码如下: var map = null; var marker; var cluster = null; function refreshMap() { var markers = []; var mar

由于异步查询和变量范围问题,代码无法工作。我不明白怎么解决这个问题。使用async:false更改为$.ajax方法-不是选项。我知道闭包,但我如何在这里实现它——我不知道。我在这里看到了关于js和jQuery异步问题中闭包的所有主题,但仍然没有看到任何内容。请帮忙。 代码如下:

var map = null;
var marker;
var cluster = null;

function refreshMap() 
{
    var markers = [];  
    var markerImage = new google.maps.MarkerImage('/images/image-1_32_t.png', new google.maps.Size(32, 32));

    $.get('/get_users.php',{},function(data){
        if(data.status == 'error')
            return false;

        var users = data.users; // here users.length = 1 - this is ok;  
        for(var i in users)
        {
            //here I have every values from users - ok
            var latLng = new google.maps.LatLng(users[i].lat, users[i].lng);
            var mark = new google.maps.Marker({
                position: latLng,
                icon: markerImage
         });

             markers.push(mark);
             alert(markers.length); // length 1
        }

    },'json');

    alert(markers.length); // length 0  
    //if I have alert() above - I get result

    cluster = new MarkerClusterer(map, markers, 
    {
        maxZoom: null,
        gridSize: null
    });
}

谢谢。

所有必须处理
标记的代码都必须在回调函数中。这行代码:

alert(markers.length); // length 0  
在Ajax调用返回之前执行(即在执行回调之前)


这意味着您的代码应该更像这样:

$.get('/get_users.php',{},function(data){
    if(data.status == 'error')
        return false;

    var users = data.users; // here users.length = 1 - this is ok;  
    for(var i in users)
    {
        //here I have every values from users - ok
        var latLng = new google.maps.LatLng(users[i].lat, users[i].lng);
        var mark = new google.maps.Marker({
            position: latLng,
            icon: markerImage
         });

         markers.push(mark);
         alert(markers.length); // length 1

         cluster = new MarkerClusterer(map, markers, 
                   {
                           maxZoom: null,
                           gridSize: null
                   });

         // more with cluster here
     }
},'json');
如果在Ajax回调中设置或更改变量,不要依赖回调之外的变量值。

只需移动以下代码:

cluster = new MarkerClusterer(map, markers, 
{
    maxZoom: null,
    gridSize: null
});
进入回调函数(第一个警报所在的位置)


问题是,对于异步请求,即使请求尚未完成,代码仍将继续执行。因此,在执行匿名回调函数之前,
标记
变量设置不正确。

有什么问题?您想要/期望什么行为?看,但是如果我需要从$.get(..)范围推送var标记中的一些数据呢?那么您需要将该变量移动到比您需要引用它的范围更高的范围。