【问题标题】:javascript variables and asynchronous callsJavaScript 变量和异步调用
【发布时间】:2012-10-10 09:13:06
【问题描述】:

我有以下代码,并且阅读了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);

【问题讨论】:

  • 在回调中创建 MarkerClusterer 有什么问题?如果你重用它,不要忘记在外面声明 var mc。

标签: javascript json asynchronous


【解决方案1】:

为什么不把这段代码sn-p:

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

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

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

编辑:

在进一步检查您的代码后,我可以看到您将标记[i] 设置为一个新的 Marker 实例,然后将其推送到同一实例的标记数组上。您可能希望将markers[i] 设置为新的Marker 实例,或者您想创建var marker,将其设置为新的Marker 实例,然后推送标记数组。

【讨论】:

  • 嗨维奈。我尝试按照建议将 MarkerClusterer 放入 getJSON 中,它在控制台中运行没有错误,但没有创建标记。是因为在加载地图后调用 MarkerClusterer 吗?
  • 不,这可能不是原因。您的地图可以预先创建。在这种情况下,您的代码可能与您的代码有关。看看这些例子:google-maps-utility-library-v3.googlecode.com/svn/trunk/…
  • 等一下,我刚刚意识到您正在将标记[i] 设置为一个新的 Marker 实例,然后也将其推送到它上面。这是故意的吗?这可能是你的问题。您希望每次都创建一个新标记: var marker = new google.maps.Marker...... 然后将其推送到标记数组中。
  • 我会试试的,虽然 alert(markers[1].title);健全性检查给出了预期的结果,所以我不确定这是问题所在。
  • 我按照建议尝试了这个,但仍然没有运气。我尝试添加和警报(opt_markers[1].title);在 MarkerClusterer 函数的开头,它可以工作 - 所以函数被调用但标记没有被放置在地图上......
【解决方案2】:

也许你需要把它放在作为 $.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 

【讨论】:

  • 我试过了,它运行没有错误,但没有制造商出现。是不是地图已经建到这个阶段太晚了?
猜你喜欢
  • 2016-11-11
  • 1970-01-01
  • 2015-09-21
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多