| Здраствуйте.
Люди добрые, подскажите, пожалуйста, вот в каком вопросе.
Все наверное знают, что такое гугл или яндекс карты. Вот несколько дней назад, я решил сделать для своего небольшого городка проект при помощи Gmap.
Смысл его прост - отметить (добавить) нужные объекты на карте. Делать это естественно програмно. Т.е, допустим, я отметил все улицы в своем городе и запихал все эти данные (название улиц, координаты и др. опции) в xml файл.
Ну, а дальше уже при помощи яваскрипта работать с этими данными, например:
// Создаем объект Street и загружаем данные по всем улицам.
var street = new Street().load('street.xml')
// Отобразить на карте 3 улицы красным цветом
street.get(['Первомайская', 'Ленина', 'Пушкина']).changeOpt({color: "red"}).addOverlay()
|
Но тут у меня возникла проблема - когда выполняется медот load (он же асинхронно запрашивает данные) и пока данные не пришли, код выполняется дальше и метод get запросит улицы, которые еще не подгрузились, следовательно, ничего не отобразится.
Проблему можно частично решить, если к объекту Street добавить какой-нибудь метод (пусть называться будет Init), который будет проверяет setInterval'ом загрузились данные или нет. Когда xml-файл подгрузился выполнять весь остальной код. Т.е. примерно получится так:
(забыл добавить про возможность использовать колбеки, но проблему это тоже не решит)
var street = new Street.load('street.xml')
street.init(function() {
// безопасно выполняем здесь код, потому что xml уже подгрузился
street.get(['Первомайская', 'Ленина', 'Пушкина']).changeOpt({color: "red"}).addOverlay()
});
|
Это работает как надо, но это не удобно и это не то, о чем я "мечтал". Ведь Street - это всего лишь объект, а таких объектов будет "много". Например, если мне нужны будут 4 объекта: Street, Home, Area, Point, то придется работать в таком режиме:
var street = new Street().load('street.xml')
street.init(function() {
// ...
});
var home = new Home().load('home.xml')
home.init(function() {
// ...
});
var area = new Area().load('area.xml')
area.init(function() {
// ...
});
var point = new Point().load('point.xml')
point.init(function() {
// ...
});
|
Это просто ужасно! И совмещать объекты как-то не удобно.
Хотелось бы иметь 1 объект (SuperObj), который принимал бы другие объекты и "соединял" бы их результат.
Т.е, допустим, я хочу отобразить маршрут автобуса №1 и все его остановки.
Тогда нужны всего лишь 3 объекта:
SuperObj - главный объект, который принимает другие объекты и выдает их результат.
Street - объект улиц, для создания маршрута автобуса
Point - объект остановок автобуса
И мне хотелось бы программировать в таком ключе:
var street = new Street().load('street.xml');
// массив маршрута автобуса
var arrStreet = ['street1','street2','street3','street4','street5','street6','street7']
var route = street.get(arrStreet)
// точки остановок
var point = new Point().load('pointBus.xml')
// Показываем на карте
var superObj = new SuperObj()
superObj.addOverlay([ route, point ])
|
Вот хотелось бы примерно так работать. Но возможно ли это при асинхроности?
Если нет, тогда я понятия не имею как проектировать систему. Может подскажите какой-нибудь совет? Может есть определенные библиотеки, плагины или что-нибудь на подобии, чтобы сделать мой проект? В общем, надеюсь на вашу помощь. Ну и спасибо хотя бы тем, кто смог дочитать мой пост до конца. | |