Клуб API Карт

Избавиться от асинхронности в геокодере

Пост в архиве.

Я извиняюсь, если был вопрос, но вроде ничего не нашел.

Есть массив с объектами метка, для метки есть свойства: координаты, адрес, текст для балуна, идентификатор. Все это дело я получаю ajax-запросом из базы данных.

Прохожусь по меткам циклом for in и добавляю их на карту. Все ок, если у нас есть координаты. Но если нет координат, то надо сделать запрос к геокодеру, записать координаты в БД и добавить метку с полученными координатами на карту. Вот тут то и проблема: мне нужно использовать текст для балуна и идентификатор, но из-за асинхронности передачи данных не выходит. Используются идетнификатор и текст последней записи, т.к. пока шел ответ от геокодера уже прошли все интерации цикла.

 

            for(var mark in result)
            {
                if(reg.test(result[mark].Coords)) //Проверка регэкпом на правильность координат
                {
                    coords = result[mark].Coords.split(',');
                    addPlacemark([parseInt(coords[0]), parseInt(coords[1])],num,mark);//Добавление метки вынесено в отдельную функцию
                } else {
                    if(result[mark].Address)
                    {
                        ymaps.geocode("Беларусь, " + result[mark].Address, {results: 1})
                            .then(
                                function (res) {
                                    coords = res.geoObjects.get(0).geometry.getCoordinates();
                                   //тут нужен доступ к result[mark] текущей интерации
                                },
                                function (err) {
                                    // обработка ошибки
                                }
                            );
                    }
                }
            }

 

9 комментариев

От асинхронности избавиться нельзя

Используйте замыкание или геокодируйте на сервере

А про замыкание можно подробней?  Да и про геокодирование на сервере если не сложно ссылкой поделитесь.

Спасибо, уже читаю.

Да, таки помогли замыкания. Благодарен. А на сервере в другом проекте буду геокодирование делать - там данные со стороннего источника и около 200 меток будет.

почему нельзя избавиться? ведь для json запросов Вы можете выставить тип запроса: синхронный или асинхронный? или я что-то не понимаю?

В геокодере это не параметризуется.

И мы не будем такое делать.

Нельзя послать синхронный запрос на другой сервер - только на свой (ну или CORS) 

Понял спасибо