2010-05-28 56 views
0

由于异步查询和变量范围问题,代码无法正常工作。我无法理解如何解决这个问题。使用async更改为$ .ajax方法:false - 不是一个选项。我知道关闭,但我怎么能在这里实现 - 不知道。我已经在这里看到关于js和jQuery异步问题中关闭的所有主题 - 但仍然没有。请帮助。 下面是代码:jQuery异步ajax查询和返回值问题(范围,关闭)

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 
    }); 
} 

感谢。

+0

什么问题?你想要什么样的行为? – kevingessner 2010-05-28 17:19:37

回答

1

只是移动这样的代码:

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

步入回调函数(其中第一个警报)

的问题是,有一个异步请求的代码将继续执行,即使要求有没完成。所以你的markers变量没有正确设置,直到你的匿名回调函数被执行。

+0

是的,你说得对。 工作正常。谢谢。 对我感到羞耻。 – GiN 2010-05-28 17:31:02

+0

看,但如果我需要从$ .get(..)作用域中的变量标记中推送一些数据呢? – GiN 2010-05-28 17:36:33

+0

然后,您需要将该变量移动到比需要引用该变量的范围更高的范围。 – joshperry 2010-05-28 17:48:28

0

所有必须处理的代码markers必须位于您的回调函数中。这行代码:

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回调变量,不依赖于他们的价值观回调之外。

+0

已经完成。 谢谢) – GiN 2010-05-28 17:31:29