2014-09-02 7 views
1

У меня есть массив 1000 LatLngBounds объектов var recBounds = []; Для каждого из них я хотел бы создать и отобразить прямоугольник, получить высоту прямоугольника центра от Google Elevation службы и цвета прямоугольника в зависимости от значение высоты.Обработка много асинхронных запросов

function getElevation() { 
     elevs = []; 
     for (i = 0; i < recBounds.length; i++) { 
      var elevation; 
      var locations = []; 
      locations.push(recBounds[i].getCenter()); 
      var positionalRequest = { 'locations': locations } 
      var elevator = new google.maps.ElevationService(); 
      elevator.getElevationForLocations(positionalRequest, 
      function (results, status) { 
       if (status == google.maps.ElevationStatus.OK) { 
        if (results[0]) { 
         elevation = results[0].elevation; 
         elevs.push(elevation); 
         if (recBounds.length == elevs.length) { 
          createRect(); 
         } 
        } 
       } 
      }) 
     } 
    } 

(я перебор каждого LatLngBounds объекта в массиве вместо передачи всего массива асинхронной функции, потому что Elevation служба принимает только около 300 мест.)

Проблемы заключается в том, что служба Elevation кажется для возврата результатов возвышения не в том же порядке, который соответствует массиву recBounds. Я предполагаю, что высота некоторых кэшированных мест немедленно возвращается и хранится в верхней части массива elevs. Поэтому, когда я пытаюсь отобразить прямоугольники, например, recBounds[4] не соответствует высоте elevs[4].

Я пытаюсь передать LatLngBounds в качестве параметра функции getElevationForLocations() и использовать его позже для создания нового массива с соответствующими границами и высотами, но без везения. Любые идеи, как реализовать это?

+0

Просьба указать [Минимальный, завершенный, проверенный и читаемый пример] (http://stackoverflow.com/help/mcve) (включая примеры данных для репликации проблемы, любой HTML/CSS/внешний javascript). – geocodezip

+0

Что такое createRect()? – geocodezip

+0

Вам необходимо обработать статус [OVER_QUERY_LIMIT] (http://stackoverflow.com/search?q=%5Bgoogle-maps-api-3%5D+OVER_QUERY_LIMIT) (в настоящее время вы молча игнорируете любой статус возврата, который не является «ОК» «). Имеет смысл уменьшить количество запросов до наименьшего возможного числа (используя максимальное количество мест, которые вы можете разместить в каждом запросе). – geocodezip

ответ

2

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

например:

function getElevation() { 
    var elevs = []; 
    var locations = []; 

    for (i = 0; i < recBounds.length; i++) { 
     var elevation; 

     locations[i] = recBounds[i].getCenter(); 

     var positionalRequest = { 'locations': locations }; 

     var elevator = new google.maps.ElevationService(); 

     elevator.getElevationForLocations(positionalRequest, (function (index) { 
      return function (results, status) { 
       if (status == google.maps.ElevationStatus.OK) { 
        if (results[0]) { 
         elevation = results[0].elevation; 
         elevs[index] = elevation; 
         if (recBounds.length == elevs.length) { 
          createRect(); 
         } 
        } 
       } 
      } 
     })(i)); 
    } 
} 

Я не пробный запуск кода, но в теории он должен работать или, по крайней мере, дать вам направление, чтобы посмотреть в. Результаты асинхронного вызова завертываются в другую функцию, позволяющую ей получить доступ к ее индексу в цикле.

Надеюсь, это поможет вам.

Смежные вопросы