Показать сообщение отдельно
  #1 (permalink)  
Старый 31.05.2014, 06:48
Аватар для squirre1
Новичок на форуме
Отправить личное сообщение для squirre1 Посмотреть профиль Найти все сообщения от squirre1
 
Регистрация: 31.05.2014
Сообщений: 3

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

Последний раз редактировалось squirre1, 31.05.2014 в 06:59.
Ответить с цитированием