Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не могу передать данные в функцию (https://javascript.ru/forum/misc/61793-ne-mogu-peredat-dannye-v-funkciyu.html)

Kondrv 09.03.2016 12:07

Не могу передать данные в функцию
 
Для работы скрипта использую 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 17:07

Кажется я решил проблему. Я заменил цикл в котором использую промис на рекурсивную функцию.
//Для каждой комбинации выстраеваем маршрут на карте и пытаемся узнать длину маршрута	
	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('Невозможно построить маршрут');
				}
			);			
		}
	}

Kondrv 09.03.2016 22:36

Окончательное решение, вернулся к циклу, но уже 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);


Часовой пояс GMT +3, время: 14:49.