Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   обойти асихнхронность в ymaps.route (https://javascript.ru/forum/events/47612-obojjti-asikhnkhronnost-v-ymaps-route.html)

squirre1 31.05.2014 06:48

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

krasovsky 02.06.2014 08:24

Я правильно понял, у тебя заранее известна начальная точка, и некоторое количество конечных. И нужно определить расстояние от начальной и до каждой из конечных?

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.