Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 02.06.2014, 08:24
Профессор
Отправить личное сообщение для krasovsky Посмотреть профиль Найти все сообщения от krasovsky
 
Регистрация: 21.12.2012
Сообщений: 869

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

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). Таким образом асинхронность нам не помешает, ведь мы уже знаем куда писать результаты
}

Примерно так. Надеюсь поможет
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В callback функции теряется контекст. Как это обойти? xintrea AJAX и COMET 4 02.06.2013 11:40
Как обойти блокировку popup'ов? czp Events/DOM/Window 1 26.04.2013 10:50
Как обойти удаление js в jquery IgorN jQuery 1 09.05.2012 01:32
Как обойти блокировку вспливаючих окон в браузерах? SonicDX Оффтопик 6 09.04.2011 16:16
Масштабирование браузером - как обойти? Sandr Internet Explorer 7 25.04.2009 01:44