2010-08-25 5 views
1

Мне очень сложно выяснить проблему с использованием следующего сценария с помощью API Карт Google v3. Я пытаюсь геокодировать неизвестное количество записей (вытащил из базы данных) и создать PolyLine из результатов. В коде есть рубин, но это не должно иметь отношения к правилу JS?Проблема с рассмотрением javascript внутри вызова функции

var trippath = new Array(); 

function drawHistoryPath(coordinates) { 
var tripHistoryPath = new google.maps.Polyline({ 
    map: map, 
    path: coordinates, 
    strokeColor: "#6A0606", 
    strokeOpacity: 1.0, 
    strokeWeight: 5 
}); 
} 

<% @pins.each do |ps| %> 
     geocoder.geocode({ 'address': '<%= escape_javascript(ps.location) %>'}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
      trippath.push(results[0].geometry.location); 
      } else { 
      alert("Geocode was not successful finding <%= escape_javascript(ps.location) %> for the following reason: " + status); 
      } 
     }); 
<% end %> 
drawHistoryPath(trippath); 

Когда drawHistoryPath вызывается, trippath не существует, но я подтвердил, что в настоящее время правильно заполняется внутри функции геокодера. Любая идея, почему она не соблюдает глобальную сферу?

ответ

2

Материал геокода будет асинхронный. Когда достигнут этот звонок до drawHistoryPath(trippath), первый запрос на геокодирование, вероятно, будет длиться много миллисекунд!

Настройте переменную Javascript, содержащую количество «контактов». Введите код внутри обратного вызова (в геокод), чтобы уменьшить этот счетчик. Когда счетчик равен нулю, вы узнаете, что пришло время позвонить drawHistoryPath. Вы сделаете этот звонок внутри функцией обратного вызова геокода.

var pinCount = <% @pins.length %>; // making this up because I don't know Rails/Ruby/whatever 

<% @pins.each do |ps| %> 
    geocoder.geocode({ 'address': '<%= escape_javascript(ps.location) %>'}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     trippath.push(results[0].geometry.location); 
     if (!--pinCount) 
      drawHistoryPath(trippath); 
     } else { 
     alert("Geocode was not successful finding <%= escape_javascript(ps.location) %> for the following reason: " + status); 
     } 
    }); 
<% end %> 
+0

В значительной степени делает вас моим героем – Ryan

+0

Ха-ха спасибо! Ну удачи. На днях я напишу свой собственный код с этим материалом геокодирования. – Pointy