Js не выводит полученные данные в leaflet popup

78
25 декабря 2021, 04:30

Вообщем у меня есть функция, очень простая срабатывает клик эта функция обращается на сервер возвращает данные и распихивает по нужным местам, а теперь проблема я вижу что есть данные они отображаются в нужных инпутах, однако в консоли и в popup, они не показывается там просто пустота хотя данные есть, я честно уже всё перепробовал, но так и не смог вытащить данные в popup, а это очень надо. Вот код:

measoftMap.choicePvz = function (placemark) {
    // Выделяем выбранный ПВЗ в списке
    document.getElementById('pvz_list').options[placemark.number].selected = true;
    let xml = '<?xml version="1.0" encoding="UTF-8"?><pvzlist><auth extra="'+settings.client_id+'"></auth><code>'+placemark.code+'</code></pvzlist>';
    let list_code = placemark.code;
    let list_comment = '';
    let list_address = '';
    let list_phone = '';
    let list_worktime = '';
    if (placemark.address == '') {
        ajax(api_url, {
            data: xml,
            success: function (response) {
                if (window.DOMParser) {
                    var parser = new DOMParser();
                    var xmlDoc = parser.parseFromString(response, "text/xml");
                } else {
                    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                    xmlDoc.async = false;
                    xmlDoc.loadXML(response);
                }
                let pvz_list = xmlDoc.getElementsByTagName('pvz');
                if (pvz_list.length > 0) {
                    list_address = pvz_list[0].getElementsByTagName('address')[0].innerHTML;
                    list_phone = pvz_list[0].getElementsByTagName('phone')[0].innerHTML;
                    list_worktime = pvz_list[0].getElementsByTagName('worktime')[0].innerHTML;
                    list_comment = pvz_list[0].getElementsByTagName('comment')[0].innerHTML;
                    measoftMap.savePvzData(list_code, list_address, list_phone, list_worktime);
                } else {
                    list_comment = 'Не удалось получить информацию о выбранном объекте.';
                }
            },
            error: function(jqxhr, status, errorMsg) {
                console.log(status + ": " + errorMsg);
            }
        });
    }
    console.log(list_address);
    console.log(list_phone);
    console.log(list_worktime);
    console.log(list_comment);
    let popup = L.popup().setLatLng(placemark.lat_lng).setContent('Адрес: ' + list_address + '<br>Телефон: '
        + list_phone + '<br>Часы работы: ' + list_worktime + '<hr>' + list_comment);
    popup.openOn(map);
};
measoftMap.savePvzData = function (code, address, phone, worktime) {
    // Записываем код и адрес выбранного ПВЗ
    document.getElementById('pvz_code').value = code;
    document.getElementById('pvz_address').value = address;
    document.getElementById('pvz_phone').value = phone;
    document.getElementById('pvz_worktime').value = worktime;
};
Answer 1

Прочтите более внимательно что такое Promise и как он работает!. Вы используете вывод данных в консоль не дожидаясь завершение выполнения ajax запроса. После выполнения ajax (когда данные пришли) вызывается метод success() в котором Вы выводите данные в инпуты. Для решения проблемы перенесите добавление данных в popup в метод success так:

document.getElementById('pvz_list').options[placemark.number].selected = true; 
 
    let xml = '<?xml version="1.0" encoding="UTF-8"?><pvzlist><auth extra="'+settings.client_id+'"></auth><code>'+placemark.code+'</code></pvzlist>'; 
    let list_code = placemark.code; 
    let list_comment = ''; 
    let list_address = ''; 
    let list_phone = ''; 
    let list_worktime = ''; 
    if (placemark.address == '') { 
        ajax(api_url, { 
            data: xml, 
            success: function (response) { 
                if (window.DOMParser) { 
                    var parser = new DOMParser(); 
                    var xmlDoc = parser.parseFromString(response, "text/xml"); 
                } else { 
                    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
                    xmlDoc.async = false; 
                    xmlDoc.loadXML(response); 
                } 
 
                let pvz_list = xmlDoc.getElementsByTagName('pvz'); 
 
                if (pvz_list.length > 0) { 
                    list_address = pvz_list[0].getElementsByTagName('address')[0].innerHTML; 
                    list_phone = pvz_list[0].getElementsByTagName('phone')[0].innerHTML; 
                    list_worktime = pvz_list[0].getElementsByTagName('worktime')[0].innerHTML; 
                    list_comment = pvz_list[0].getElementsByTagName('comment')[0].innerHTML; 
 
                    measoftMap.savePvzData(list_code, list_address, list_phone, list_worktime); 
                } else { 
                    list_comment = 'Не удалось получить информацию о выбранном объекте.'; 
                } 
                 
                console.log(list_address); 
                console.log(list_phone); 
                console.log(list_worktime); 
                console.log(list_comment); 
                let popup = L.popup().setLatLng(placemark.lat_lng).setContent('Адрес: ' + list_address + '<br>Телефон: ' 
        + list_phone + '<br>Часы работы: ' + list_worktime + '<hr>' + list_comment); 
                popup.openOn(map); 
                 
            }, 
            error: function(jqxhr, status, errorMsg) { 
                console.log(status + ": " + errorMsg); 
            } 
        }); 
    }

READ ALSO
Как запретить прокрутку контенту, а оверлею разрешить [закрыт]

Как запретить прокрутку контенту, а оверлею разрешить [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

94
Чем put отличается от patch?

Чем put отличается от patch?

Изучаю REST APIНе понимаю отличия метода PUT от PATCH: они же оба используются для обновления данных

107
Русский текст в javascript

Русский текст в javascript

Получаю с помощью AJAX запроса русский текст с сервераПытаюсь вывести

139
Javascript Array перебрать массив

Javascript Array перебрать массив

У меня динамически можно создавать группы, у каждой группы своя цена

122