Как я могу выполнить итерацию XMLHttpRequest? - PullRequest
1 голос
/ 05 июля 2019

У меня есть два файла: один файл содержит код php (и он работает правильно), а другой содержит javacript.Проблема в странице JavaScript:

function calcDist() {
    var citta = $("#txtpartenza").val();


    $.ajax({
        type: "POST",
        url: 'mostraPartenze.php',
        dataType: "json",
        success: function (data) {
            $.each(data, function (index) {
                var partenza = data[index];
                trovaGeo(citta, partenza);

            });

        }

    });
}

function trovaGeo(partenza, destinazione) {
    var latPartenza;
    var lonPartenza;
    var latDestinazione;
    var lonDestinazione;

    console.log(partenza);            // for test
    console.log(destinazione);        // for test

    var xmlhttpPart = new XMLHttpRequest();
    var xmlhttpDest = new XMLHttpRequest();

    xmlhttpPart.open("GET", "https://geocoder.cit.api.here.com/6.2/geocode.json?searchtext="+partenza+"&app_id=[APP_ID]&app_code=[APP_CODE]&gen=8", true);
    xmlhttpPart.send();

    xmlhttpDest.open("GET", "https://geocoder.cit.api.here.com/6.2/geocode.json?searchtext="+destinazione+"&app_id=[APP_ID]&app_code=[APP_CODE]&gen=8", true);
    xmlhttpDest.send();

    xmlhttpPart.onreadystatechange = function () {
        if (xmlhttpPart.readyState == 4 && xmlhttpPart.status == 200) {
            xmlhttpDest.onreadystatechange = function () {
                if (xmlhttpDest.readyState == 4 && xmlhttpDest.status == 200) {

                    var resPart = JSON.parse(xmlhttpPart.responseText);

                    latPartenza = resPart.Response.View[0].Result[0].Location.DisplayPosition.Latitude;
                    lonPartenza = resPart.Response.View[0].Result[0].Location.DisplayPosition.Longitude;

                    var resDest = JSON.parse(xmlhttpDest.responseText);

                    latDestinazione = resDest.Response.View[0].Result[0].Location.DisplayPosition.Latitude;
                    lonDestinazione = resDest.Response.View[0].Result[0].Location.DisplayPosition.Longitude;

                    lonDestinazione = resDest.Response.View[0].Result[0].Location.DisplayPosition.Longitude;   

                    console.log(latPartenza);
                }

            };
        }
    };

}

Ajax работает правильно;Я могу без проблем вызвать trovaGeo(citta, partenza), но в trovaGeo(partenza, destinazione) функции XMLHttpRequest «part» не работает должным образом: в консоли переменная latPartenza никогда не печатается и, очевидно, все коды в xmlhttpPart.onreadystatechange = [...] никогда не выполняются.

Для полноты это сердце php файла:

$i = 0;
$citta = array();

while ($rows = $result->fetch_assoc()) {
    $citta[$i] = $rows['partenza'];
    $i=$i+1;
}
echo json_encode($citta);

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Я нахожу проблему.

Я должен использовать preventDefault в первой строке события on('submit'...

Это решение:

$('form').on('submit', function (e) {

    e.preventDefault();

    [...]

0 голосов
/ 05 июля 2019

Возможно, проблема связана с вложенными onreadystatechagestatements, возможна задержка ответов.Но я вижу, что второй запрос зависит от ответа первого запроса. Попробуйте следующее изменение

xmlhttpPart.onreadystatechange = function() {
      if (xmlhttpPart.readyState == 4 && xmlhttpPart.status == 200) {

          xmlhttpDest.open("GET", "https://geocoder.cit.api.here.com/6.2/geocode.json?searchtext=" + destinazione + "&app_id=[APP_ID]&app_code=[APP_CODE]&gen=8", true);
          xmlhttpDest.send();
          xmlhttpDest.onreadystatechange = function() {
             //  your code
                  console.log(latPartenza);
              }

          };
      }
  };
...