javascript变量和异步调用

时间:2012-10-10 09:13:07

标签: javascript json asynchronous

我有以下代码,并且阅读this,我明白它不会工作,因为getJSON调用是异步的。我如何更改此设置,以便使用一整套标记触发MarkerClusterer函数?我已经尝试将MarkerClusterer函数放入getJSON调用中,但没有运气......

var mcOptions = {gridSize: 50, maxZoom: 9};
var markers = [];

function parse_json(json) {
  if (json.length > 0) {
    for (i=0; i<json.length; i++) {
        var report = json[i];  
        var latLng = new google.maps.LatLng(report.latitude, report.longitude);
        markers[i] = new google.maps.Marker({
            position: latLng, 
            title: report.name + ' ' + report.surf_size_ft_round, 
            url: "/place/"+report.slug 
        });                     

        google.maps.event.addListener(markers[i], 'click', function() {
          window.location.href = markers[i].url;
        }); 
        markers.push(markers[i]);
    }
  } 
}; 


$.getJSON('<%= request.fullpath + ".json" %>', function(stream) {   
if (stream.length > 0) {
  parse_json(stream);
  alert(markers[1].title);  //sanity check - gives result
  }
});   


    alert(markers[5].title);  // sanity check - empty 
var mc = new MarkerClusterer(map, markers, mcOptions);

2 个答案:

答案 0 :(得分:1)

为什么不放这段代码:

mc = new MarkerClusterer(map, markers, mcOptions);

在$ .getJSON中的匿名回调函数内?只需在$ .getJSON范围之外的某处声明var mc;即可在其他位置访问它。

或者,您可以在parse_json函数结束时触发事件,侦听该事件,然后在事件触发时启动另一个创建MarkerClusterer对象的函数。看看这个:How to trigger event in JavaScript?

编辑:

在检查你的代码之后,我可以看到你将marker [i]设置为一个新的Marker实例,然后推送到同一个实例的markers数组。您可能想要将marker [i]设置为新的Marker实例,或者您想要创建var marker,将其设置为新的Marker实例,然后按下markers数组。

答案 1 :(得分:1)

也许您需要将它作为$ .getJSON的输入提供给成功函数?

$.getJSON('<%= request.fullpath + ".json" %>', function(stream) {   
    if (stream.length > 0) {
    parse_json(stream);
    alert(markers[1].title);  //sanity check - gives result
    mc = new MarkerClusterer(map, markers, mcOptions);
  }
});   

alert(markers[5].title);  // sanity check - empty