Клуб API Карт

Последовательный вызов ymaps.geocode

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

Доброго времени суток!

Уже который день бьюсь над задачей последовательного вызова асинхронных функций.

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

Понимаю, что выполненение данных запросов асинхронно, и что когда сервер ответит, тогда и впишется в массив.

Вопрос, как заполнить массив согласно вызовам в цикле, или хотя бы получить строку моего запроса, т.е. чтобы я знал, что данные координаты относятся к данному адресу?

Заранее спасибо!

 

 for(var i = 0; i < obj.length; i++) {
     ymaps.geocode(obj[i].address).then(
         function (res) {
             var coord = res.geoObjects.get(0).geometry.getCoordinates();
             tmpArr.push(coord);
             if(tmpArr.length == obj.length) {
                 logisticsMap.writeMapData(JSON.stringify(tmpArr));
             }
         }
     );
 };

 

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

 

Уже который день бьюсь над задачей последовательного вызова асинхронных функций.

Это Вы зря. Велосипедизм - пустая трата времени. Подпишитесь на наш блог, в нем мы уже давно поделились подобной реализацией

Александр
28 января 2016, 01:24

Спасибо!!!

Александр
28 января 2016, 01:24

Еще раз большое спасибо за данный класс, все отлично работает!

Осмелюсь спросить еще...можно ли данный класс привязать к такому коду?

Дело в том, что я не силен в JS, работаю на delphi. А тут пришлось ваять на новом для меня языке.

 

                    ymaps.route([pointA, pointB], {}).then(                        function (route) {                            var routeLength = route.getLength();                        }                    );

Расскажите, что за проект Вы делаете? Зачем вам множественное геокодирования и маршрутизация?

Александр
28 января 2016, 01:24

Это часть рабочего проекта, его расширение.

Всего лишь задача комивояжера.

Нужно проложить оптимальный маршрут объезда списка объектов.

Для построения матрицы рсстояний (матрицы смежности) нужно вычислить расстояния от каждого города к каждому.

Сейчас матрица формируется неверно, т.к. при запросы асинхронны, на этапе проектирования приходится искусственно тормозить цикл и получать расстояние по одному. Но это не выход, т.к. запросы выполняются с разными скоростями, и не угадаешь задержку.

Готов поделится мыслями и выслушаю критику и предложения.

Это функционал сайта или десктопное приложение?

Александр
28 января 2016, 01:24

Десктоп...написан на делфи...для вывода карты используется ActiveX компонент.

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

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

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

Дело в том что АПИ нельзя использовать в закрытых системах. Только на сайтах

 2.3.2. Сервис может использоваться Пользователем только в рамках сайтов, доступных для бесплатного открытого использования неограниченным кругом лиц. Сервис не может использоваться для проектов, требующих оплаты, или иным образом ограничивающих доступ к ним третьих лиц. Необходимость зарегистрироваться не считается ограничением доступа в рамках настоящего пункта.
Александр
28 января 2016, 01:24

Одим словом, продублирую вопрос, подскажи пожалуйста как можно победить ассинхронность в функции ymaps.route.

Александр
28 января 2016, 01:24

Ок, т.е. для легитимного использования нужен сайт? При этом такой, на который есть свободный доступ. Правильно я понимаю?

Вопрос, если сервер этого сайта будет доступен мне (и соответственно всем желающим) не круглосуточно, то это считается открытым доступом?

Александр
28 января 2016, 01:24

Я зарегистрировал домен nich2000.ru (создал ключ на этот же домен), страница будет там. 

Страница будет размещена на одном из хостингов, поэтому к ней будет круглосуточный доступ.

На этом легитимность использования, я думаю, будет выполнена.

Посему, повторюсь с просьбой. Подскажите советом как быть с асинхронными запросами. 

Создаете счетчик = количеству маршрутов.

При получении ответа по каждому из маршрутов уменьшаете его на единицу.

Когда он станет = 0, все ответы получены.

Так собственно и работает тот класс, ссылку на который я Вам давал