Обратные вызовы через Обратные вызовы - PullRequest
1 голос
/ 23 сентября 2011

Я хочу поставить маркеры на карте.Источником является запрос json, который возвращает города.

У меня есть функция (sencha), которая возвращает записи (асинхронные), и функция (google maps api), которая возвращает lng, lat для определенных городов.(асинхронный) и метод (Google Maps), который ставит маркеры на карте.

Результатом должен быть маркер на карте в месте, рассчитанном Google с заголовком, извлеченным из записи.

загрузка записей

offers = App.stores.offers.load({
    callback: function(records, operation, success){...}
})

получить местоположение

geocoder = new google.maps.Geocoder();
geocoder.geocode(
  {'address': adress},
  function(results, status) {...}
}

и установите маркер

marker = new google.maps.Marker({
  map: map,
  position: loc,
  title: text
});

Чего я не хочу делать, это загрузить запись, перебрать каждую запись, выяснить местоположение города и поставить там маркер.

синхронно Я бы сделал:

   records = App.stores.offers.load();
   for (var i=0; i < records.length; i++) {
     setMarker( map, getLocation(records[i].data["city"]), cords[i].data["text"]);
   }

Как правильно соединить его с асинхронными функциями?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2011

В конце концов я реализовал это с помощью extjs / sencha.Второй проблемой, с которой я столкнулся, были ограничения на службу карт Google (у меня было много исключений, превышавших квоту).Так что это не совсем ответ на вопрос.Поэтому я отметил другой ответ как правильный, потому что он ближе к вопросу.Вот код, который у меня был в конце концов, может ли он кому-нибудь помочь.

0 голосов
/ 23 сентября 2011

Я действительно не знаю, что именно делает функция App.stores.offers.load, но я предполагаю, что ее аргументы функции обратного вызова содержат результаты загрузки в переменную records. В этом случае просматривайте записи внутри функции обратного вызова и для каждого геокода вызова, а также для маркеров места обратного вызова геокода (в этом нет ничего плохого).

РЕДАКТИРОВАТЬ: это не проверено и, вероятно, не наиболее эффективно, но должно работать:

offers = App.stores.offers.load({
    callback: function(records, operation, success){
        if (success) {//or sth like this
            var complete;
            for (var i = 0; i < records.length; i++) {
                complete = false;
                geocoder.geocode( {'address': records[i].adress},
                  function(results, status) {
                    if (status == google.maps.GeocoderStatus.OK) {
                        map.setCenter(results[0].geometry.location);
                        var marker = new google.maps.Marker({
                            map: map,
                            title: results[i].text,
                            position: results[0].geometry.location
                        });
                    } else {
                        alert("Geocode was not successful for the following reason: " + status);
                    }
                    complete = true;
                });
                while (!complete);
            }
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...