Пытаюсь обойти произвольное количество точек и посчитать расстояние от корневой точки до них (упрощенно решаю
задачу Коммивояжера).
Для этого использую маршрутизатор Яндекс Карт
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му посоветовали использовать
замыкания. Я прочитал про замыкания, понял что это, но не понял как их можно здесь применить.