Проблема с парсингом JSON геокодера в JS

110
06 декабря 2020, 08:10

необходимо получить координаты по адресу через геокодер из JSON, и всё бы хорошо, но парситься полученный JSON не хочет, выдаёт ошибку. При этом если зайти в инструменты разработчика в Chrome и выполнить скрипт вручную, то всё работает. Подскажите, кто знает, как решить проблему?

 <script src="http://maps.api.2gis.ru/2.0/loader.js?pkg=full" data-id="dgLoader"></script>
    <script type="text/javascript">
        var map;
        DG.then(function () {
            map = DG.map('map', {
                "center": [48.65626, 44.477077],
                "zoom": 10
            });
            var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest;
            var meetings = document.getElementById('MeetingsInfo');
            var meetingsCount = Number.parseInt(document.getElementById('MeetingsCount').innerText);
            for (var i = 0; i < meetingsCount; i++) {
                var req = new XHR();
                req.open('GET', 'https://nominatim.openstreetmap.org/search?q=' + encodeURIComponent(meetings.rows[i+1].cells[0].innerText) + '&format=json');
                req.send(null);
                if (req.responseText != null) {
                    var info = JSON.parse(req.responseText);//здесь ошибка
                    var place = info[0];
                    var lat = Number.parseFloat(place.lat);
                    var lon = Number.parseFloat(place.lon);
                    DG.marker([lat, lon]).addTo(map).bindPopup(meetings.rows[i + 1].cells[2].innerText);
                }
            }
            geoclicker = true;
        });
    </script>

UPD: сделал обработку запроса через onload, для первой записи всё обработалось, а на следующей опять ошибка. При этом ещё и не хочет доставать данные из поля таблицы, хотя вручную достаются

Answer 1

Оказалось, что я неправильно обрабатывал асинхронный запрос. Так всё заработало:

        <script type="text/javascript">
        var map;
        DG.then(function () {
            map = DG.map('map', {
                "center": [48.65626, 44.477077],
                "zoom": 10
            });
            var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest;
            var meetings = document.getElementById('MeetingsInfo');
            var meetingsCount = Number.parseInt(document.getElementById('MeetingsCount').innerText);
            var meetingsArr = [];
            for (let i = 1; i < meetingsCount+1; i++) {
                meetingsArr.push(meetings.rows[i]);
            }
            meetingsArr.forEach(async (meeting) => {
                var req = new XHR();
                await req.open('GET', 'https://nominatim.openstreetmap.org/search?q=' + encodeURIComponent(meeting.cells[0].innerText) + '&format=json');
                req.onload = function() {
                    if (req.responseText != null) {
                        var info = JSON.parse(req.responseText);
                        var place = info[0];
                        var lat = Number.parseFloat(place.lat);
                        var lon = Number.parseFloat(place.lon);
                        DG.marker([lat, lon]).addTo(map).bindPopup(meeting.cells[2].innerText);
                    }
                };
                req.send(null);
            }
            );
            geoclicker = true;
        });
    </script>
READ ALSO
Найти в URL часть строки

Найти в URL часть строки

Как проверить есть ли в URL часть строкиСтрока полного вида

98
Как сделать сложный блок в CSS [дубликат]

Как сделать сложный блок в CSS [дубликат]

Как сделать такой блок, это делается в CSS или с помощью картинки? Причем чтобы там можно было размещать блокиЕсли CSS то как?

103
Как правильно убить процесс средствами Winapi/C++?

Как правильно убить процесс средствами Winapi/C++?

Подскажите как корректно убить процесс средствами с++/winapi ?

106