Клуб API Карт

Как передать в <div> время поездки по маршруту из цикла?

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

Добрый день.

Вот такой код у меня раньше отлично работал...

 <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>

<script type="text/javascript">

ymaps.ready(init);

function init () {

var myMap = new ymaps.Map("map", {center:[56.8829, 60.5181], zoom:11});

                                var arr1=['точки маршрута'];

                                if (arr1 != null ) {

ymaps.route( arr1 , {

mapStateAutoApply:false

}).then(function (route) {

 myMap.geoObjects.add(route);

 $('#list1').append(route.getHumanJamsTime());

}, function (error) {

alert('Возникла ошибка: ' + error.message);

});

}

</script>

<div id="map" style="width: 400px; height: 400px"> </div> 

                <div id="list1">&nbsp;</div>

Приходилось для каждого <div> отдельный кусок кода писать с простроением маршрута. Сейчас набросал цикл для теста...Но не могу передать значение в <div>. Код такой:

var myMap = new ymaps.Map("map", {center:[56.8829, 60.5181], zoom:11});

var arr=[];

var divid=[];

for (var i=1;i<4;i++) {

divid[i]='#list'+i;

arr[i]= ['точки маршрута'];

if (arr[i] != null ) {

ymaps.route( arr[i] , {

mapStateAutoApply:false

}).then(function (route) {

 myMap.geoObjects.add(route);

 $(divid[i]).append(route.getHumanJamsTime());

}, function (error) {

alert('Возникла ошибка: ' + error.message);

});

}

}

Массив с id (divid[i]='#list'+i;) генерируется нормально, но в функцию .then(function (route) не передается. Вообще, когда начинает выполнятся эта функция, i = 5 почему-то. Хотя простраивает 4 маршрута, и выдает разные цифры (по крайней мере если запускать без цикла...с циклом по-идее тоже разные значения, при разных маршрутах должны быть, но при этом divid нужно будет вписать вручную....). Дак вот собственно вопрос - как это все автоматом сделать, чтобы из цикла в правильные <div> передавалось?

 

 

3 комментария

функция в then выполнится асинхронно, после окончания цикла, поэтому I = 5

Можно обернуть вызов в замыкание. Почитайте что-нибудь про JavaScript 

Про javascript я читал не мало, просто не приходилось использовать промисы в функциях...и мне логика не позволяет понять как then выполняется после цикла, когда она находится внутри тела цикла, при этом выполняется столько же раз сколько цикл, при этом выдавая разные результаты....Пробовал воткнуть цикл в функцию, которая в then...тоже не то получилось...как все же передать в функцию которая в then() -  i, из которой был запущен этот then? 

route это по сути обращения на сервер.

Ответы на них могут прийти и в разном порядке

АПИ использует эту библиотеку.

там есть работа с коллекциями типа .all(), .allResolved

можно поискать на хабре статьи про промисы