@olymp

Javascript как передать значение из функции?

Ломаю голову уже вторую неделю...

Пытаюсь реализовать на Wordpress построение маршрутов от точки геолокации до объекта размещения.
Изначально в Плагине не было возможности реализации прокладки маршрутов, приходится допиливать и прошу помощи знатоков!

Что имею:

if (navigator.geolocation) { //Проверка, поддерживает ли браузер геолокацию
  	 navigator.geolocation.getCurrentPosition(function (position) {      //This gets the
	

	 var propsAjaxURL = services_vars.ajaxurl;
	 var propsSecurity = $('#securityAppMap').val();

     var latitude = position.coords.latitude;                    //users current
     var longitude = position.coords.longitude;                 //location
     var coords = new google.maps.LatLng(latitude, longitude); //Создаеем переменную для координат карты
					
					
			$.ajax({
							            type: 'POST',
							            dataType: 'json',
							            url: propsAjaxURL,
							            data: {
							                'action': 'reales_get_single_property',
							                'single_id': $('#single_id').val(),
							                'security': propsSecurity
							            },
							            success: function(data) {
							                var singlePosition = new google.maps.LatLng(data.props[0].lat, data.props[0].lng);
							            	

							            	


							                var styledMapType = new google.maps.StyledMapType(styles, {
							                    name : 'Styled'
							                });
							                map.mapTypes.set('Styled', styledMapType);
							                map.getStreetView().setOptions(panoramaOptions);

							                if(data.getprops === true) {
							                    
							                    map.setCenter(singlePosition);
							                    map.setZoom(parseInt(services_vars.zoom));

							                    addMarkers(data.props, map);
							                }

							                setPOIControls(map, singlePosition);
							            },
							            error: function(errorThrown) {
 
							            }
			});
							        

     var directionsService = new google.maps.DirectionsService();
     var directionsDisplay = new google.maps.DirectionsRenderer();
     var propsAjaxURL = services_vars.ajaxurl;
     var propsSecurity = $('#securityAppMap').val();
     var end = '53.085622, 70.307219';
			     	


     var mapOptions = //Sets map options
     {
       zoom: 15,  //Наборы изменяют масштаб карты (0-21)
       center: coords, //увеличьте масштаб пользовательского местоположения
       mapTypeControl: true, //позволяет Вам выбирать тип карты, например, карту или спутник
       name : 'Styled',
       navigationControlOptions:
       {
         style: google.maps.NavigationControlStyle.SMALL //наборы на карту размер средств управления, например, увеличение масштаба изображения
       },
       mapTypeId: google.maps.MapTypeId.ROADMAP //тип наборов карты: ROADMAP, SATELLITE, HYBRID, TERRIAN
		};

     map = new google.maps.Map( /*создаем переменную Карты*/ document.getElementById("mapSingleView"), mapOptions /*Создает новую карту, используя переданные дополнительные параметры в mapOptions параметре.*/);
     var styledMapType = new google.maps.StyledMapType(styles, {
                    name : 'Styled'
                });

     directionsDisplay.setMap(map);
     directionsDisplay.setPanel(document.getElementById('panel'));
     var request = {
       origin: coords,
       destination: end,
       travelMode: google.maps.DirectionsTravelMode.DRIVING
     };
							
     directionsService.route(request, function (response, status) {
       if (status == google.maps.DirectionsStatus.OK) {
         directionsDisplay.setDirections(response);
       }
     });
   });
 }


Пытаюсь вывести за место var end = '53.085622, 70.307219'; значение var end = singlePosition;, но не удается передать значение из другой функции function(data)

var end = '53.085622, 70.307219'; - приведено как пример, что маршрут строиться, если задать координаты вручную, если указывать значение var end = singlePosition;, карта умирает...

0f96efc281bc4c2a98ccbb694ff0bbe1.jpg
Для примера вывел var end = '53.085622, 70.307219';, на принтскрине результат, что маршрут прокладывается от точки А до точки 53.085622, 70.307219. Так же происходит вывод маркера с правильным месторасположением:
var singlePosition = new google.maps.LatLng(data.props[0].lat, data.props[0].lng);


Возможно ли вывести значения var end = singlePosition;, из другой функции? как заменить точку Б (координаты) на значение var end = singlePosition;

Что я делаю нет так???
  • Вопрос задан
  • 522 просмотра
Решения вопроса 1
lazalu68
@lazalu68
Salmon
Можно просто строить маршрут не сразу, а только после выполнения запроса:

$.ajax({
    ...
    success: function(data) {
        var singlePosition = new google.maps.LatLng(data.props[0].lat, data.props[0].lng);
        var request = {
            origin: coords,
            destination: singlePosition,
            travelMode: google.maps.DirectionsTravelMode.DRIVING
        };
       directionsService.route(...);
       ...
    },
    ...
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Javascript как передать значение из функции?

Короткий ответ: никак.
Вы используете destination: end еще до того, как отработал ajax запрос.

Что я делаю нет так???
Пытаетесь работать со сложными штуками типа гуглмапс вместо изучения основ.

За две недели вполне можно было почитать про область видимости переменных, return и асинхронные вызовы.

Можно переписать с использованием callback'ов или promise'ов, как показал Никита Полевой
Ответ написан
Комментировать
therealmoronto
@therealmoronto
Middle full stack developer :)
Тут вы можете вывести нужные данные из AJAX, но только через JSON-объект. Скопировать его можно будет так JSON.parse(JSON.stringify()). Но не забывайте, что callback функция AJAX придет тогда, когда от сервера поступит ответ, до тех пор программа будет выполнять следующий за AJAX код (почитайте про асинхронность и callback-функции).
Поэтому все операции с данными, которые поступят от сервера, лучше выполнять внутри этого callback'а. В противном случае карта будет "ложиться" в любое удобное и неудобное время.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы