Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема в асинхронности javascript'a
 
 автор: antone   (12.07.2009 в 17:05)   письмо автору
 
 

Здраствуйте.
Люди добрые, подскажите, пожалуйста, вот в каком вопросе.
Все наверное знают, что такое гугл или яндекс карты. Вот несколько дней назад, я решил сделать для своего небольшого городка проект при помощи 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 ])


Вот хотелось бы примерно так работать. Но возможно ли это при асинхроности?
Если нет, тогда я понятия не имею как проектировать систему. Может подскажите какой-нибудь совет? Может есть определенные библиотеки, плагины или что-нибудь на подобии, чтобы сделать мой проект? В общем, надеюсь на вашу помощь. Ну и спасибо хотя бы тем, кто смог дочитать мой пост до конца.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования