如何迭代XMLHttpRequest?

时间:2019-07-05 14:48:30

标签: javascript ajax here-api

我有两个文件:一个文件包含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“部分”无法正常工作:在控制台中,变量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 :(得分:0)

我找到了问题。

preventDefault事件的第一行中我必须使用on('submit'...

这是解决方案:

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

    e.preventDefault();

    [...]

答案 1 :(得分:-1)

问题可能与嵌套的onreadystatechage语句有关,可能会延迟响应。但是我可以看到第二个请求取决于第一个请求的响应。请尝试以下更改

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);
              }

          };
      }
  };