Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.03.2016, 12:07
Новичок на форуме
Отправить личное сообщение для Kondrv Посмотреть профиль Найти все сообщения от Kondrv
 
Регистрация: 09.03.2016
Сообщений: 5

Не могу передать данные в функцию
Для работы скрипта использую API Яндекс карт
Обратите пожалуйста внимание на строки 35-40.
Я так понимаю, что запуск функции после then происходит только после загрузки ymaps.route. При этом во время запуска скрипта я понял что сначала проходит весь цикл, а потом для каждой итерации, по мере загрузки происходит запуск функции после then. В самой функции происходит расчет расстояния между двумя точками. Но так как эта функция запускается после прохождения всего цикла, я не могу узнать какое расстояние относится к какой комбинации адресов. Переменная i к моменту запуска функции равна -1. Подскажите пожалуйста, как можно решить эту проблему

Привожу код:
function init () {

  // Создаем карту 
    var myMap = new ymaps.Map('map', {
        center: [59.892450, 30.357102],
        zoom: 15        
    });
	
	//Задаем список адресов
	var adr = new Array ("'Спб, ударников 1'", "'Спб, ударников 20'", "'Спб, оптиков 1'", "'Спб, оптиков 20'");
	var comb = new Array;
	var i,j;
	i = adr.length-1;	
	
	//В следующем цикле заполняем список комбинаций адресов
	while (i>=0) {
		j = i-1;
		while (j>=0){
			comb[comb.length] = (i + '-' + j);			 
			j--;
		 }
		i--;
	}
	
	var lenComb = new Array;
	i = comb.length - 1;
	j = i + 1;
	var pos, first, second;
	
	//Для каждой комбинации выстраеваем маршрут на карте и пытаемся узнать длину маршрута
	while (i>=0) {
		pos =  comb[i].indexOf('-');
		first = comb[i].substring(0,pos);
		second = comb[i].substring(pos+1,j);
		ymaps.route([adr[first],adr[second]], {mapStateAutoApply:true}).then(		
		function(route) {
			myMap.geoObjects.add(route);
			Alert(route.getHumanLength());
            //lenComb[i] = route.getHumanLength();
			//alert(comb[i] + " " + lenComb[i]);
		},
		  function(error) {
			alert('Невозможно построить маршрут');
		  }
		);

		i--;  
	} 
}

ymaps.ready(init);

Последний раз редактировалось Kondrv, 09.03.2016 в 12:54.
Ответить с цитированием
  #2 (permalink)  
Старый 09.03.2016, 17:07
Новичок на форуме
Отправить личное сообщение для Kondrv Посмотреть профиль Найти все сообщения от Kondrv
 
Регистрация: 09.03.2016
Сообщений: 5

Кажется я решил проблему. Я заменил цикл в котором использую промис на рекурсивную функцию.
//Для каждой комбинации выстраеваем маршрут на карте и пытаемся узнать длину маршрута	
	function rekurs (i) {
		if	(i >= 0) {
			pos = comb[i].indexOf('-');
			first = comb[i].substring(0, pos);
			second = comb[i].substring(pos + 1, j);        

			ymaps.route([adr[first], adr[second]]).then(
				function (route) {				
					myMap.geoObjects.add(route);					
					console.log(comb[i] + " " + route.getHumanLength());
					i--;
					rekurs(i);
				},
				function (error) {
					alert('Невозможно построить маршрут');
				}
			);			
		}
	}
Ответить с цитированием
  #3 (permalink)  
Старый 09.03.2016, 22:36
Новичок на форуме
Отправить личное сообщение для Kondrv Посмотреть профиль Найти все сообщения от Kondrv
 
Регистрация: 09.03.2016
Сообщений: 5

Окончательное решение, вернулся к циклу, но уже foreach
function init() {

  // Создаем карту 
  var myMap = new ymaps.Map('map', {
    center: [59.892450, 30.357102],
    zoom: 10
  });

  //Задаем список адресов
  var adr = ['Спб, ударников 1', 'Спб, ударников 20', 'Спб, оптиков 1', 'Спб, оптиков 20', 'питер, ленина 1'
  ,'Спб, труда 2','Спб, бухарестская 1','Спб, невский 100','Спб, магнитогорская 51','Спб, большевиков 2','Спб, дыбенко 2'
  ,'Спб, гагарина 2','Спб, софийская 2','Спб, труда 2','Спб, пионерская 2','Спб, ленинский проспект 2','Спб, стачек 2'
  ,'Спб, правды 2','Спб, декабристов 2','Спб, швецова 2','Спб, чехова 2','Спб, Беринга 2','Спб, одоевского 2',
  'Спб, шаврова 2','Спб, руднева 2','Спб, антоновская 2'];
  var comb = [];

  for (var i = 0; i < adr.length; i++) {
    for (var j = 0; j < i; j++) {
      comb.push(i + '-' + j);
    }
  }

  console.log("количество комбинаций " + comb.length);
  
  //Для каждой комбинации выстраеваем маршрут на карте и пытаемся узнать длину маршрута
  var arrayWays = comb.forEach(function(way, index, array) {
    var pos, first, second;

    pos = way.indexOf('-');
    first = way.substring(0, pos);
    second = way.substring(pos + 1, array.length);

    ymaps.route([adr[first], adr[second]]).then(
      function(route) {
        myMap.geoObjects.add(route);
        console.log(route.getHumanLength(), comb[index], index);      
      },
      function(error) {
        alert('Невозможно построить маршрут');
      }
    );
  });
}

ymaps.ready(init);
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать данные в скрипт? ivaniv1900 jQuery 6 23.06.2014 16:18
PROTOTYPE передать this в функцию! barkar Общие вопросы Javascript 4 11.02.2014 23:32
передать переменную в функцию B1ackgh0st AJAX и COMET 25 29.01.2014 22:58
как передать переменную в функцию Virgile Общие вопросы Javascript 2 08.08.2010 22:50
Не получается передать в функцию значение javascript_pupil Events/DOM/Window 9 06.11.2009 15:32