обойти асихнхронность в ymaps.route
Пытаюсь обойти произвольное количество точек и посчитать расстояние от корневой точки до них (упрощенно решаю задачу Коммивояжера).
Для этого использую маршрутизатор Яндекс Карт http://api.yandex.ru/maps/doc/jsapi/...pts/router.xml В случае с одной точкой - более-менее понятно. В случае с обходом произвольного количества точек - страшно и непонятно. /* тут будут результаты. Не знаю как иначе сделать */ var superGlobalVar = []; function getLenght(coord,myCallback) { ymaps.route(coord).then( // это асихнронный маршрутизатор яндекс.карт function (route) { var returnVal = route.getLength(); myCallback(returnVal); }, function (error) { alert("Возникла ошибка: " + error.message); } ); } function processLenght(len) { alert(len); /* никак не придумал способ, чтобы getLength возвращала данные, поэтому и создал superGlobalVar */ superGlobalVar.push[len]; } // если просто расстояние от корневой до другой точки myRootPoint = [55.4,33.7]; myAnyPoint = [33.8,55.4]; myCoor = [myRootPoint, myAnyPoint]; getLenght(myCoor, processLenght); /*---- а если циклом? Ведь этот код будет работать некорректно - запросы могут выполниться в разное время и массив результатов будет заполнен не по порядку... */ myPoints = [ [55.4, 33.0], [45.2, 53.7], [85.3, 23.7], [55.9, 73.7] ]; myPointRoot = [33.8,55.4]; //корневая точка for (i = 0; i<myPounts.lenght; i++) { // считаем расстоение от корневой до остальных coor = [myPointRoot, myPoints[i]]; getLenght(coor, processLenght); } в идеале хочется такого: function getLenght(coord) { ymaps.route(coords) /* ... some code ... */ return route.getLength(); } for (i = 0; i<myPounts.lenght; i++) { coor = [myPointRoot, myPoints[i]]; myArr[i] = getLenght([myPointRoot,myPoint2]); } p.s. Читал про JQuery.promises, deffered но так и не понял, как это применть. p.p.s. Нашел топик, где у человека была смежная задача - http://clubs.ya.ru/mapsapi/replies.xml?item_no=48192 Eму посоветовали использовать замыкания. Я прочитал про замыкания, понял что это, но не понял как их можно здесь применить. |
Я правильно понял, у тебя заранее известна начальная точка, и некоторое количество конечных. И нужно определить расстояние от начальной и до каждой из конечных?
var startcoords = [55.4,33.7] var coords = { 0:{start:[55.4, 33.0],end:[0,0]}, 1:{start:[55.4, 33.0],end:[0,0]}, 2:{start:[55.4, 33.0],end:[0,0]}, 3:{start:[55.4, 33.0],end:[0,0]}, }//создаем объект, где старт - та точка до которой хочешь узнать расстояние, end - расстояние(я записал как координаты,потому что не знаю что там твои карты должны возвратить) for (i = 0; i<myPounts.lenght; i++) { getLenght(startcoords,coords[i]);//передаем начальные координаты(если нужно,если нет убери, и объект c координатами start и в который будем записывать, то бишь end). Таким образом асинхронность нам не помешает, ведь мы уже знаем куда писать результаты } Примерно так. Надеюсь поможет |
Часовой пояс GMT +3, время: 13:03. |