【问题标题】:Javascript Callback Within a Callback回调中的 Javascript 回调
【发布时间】:2025-12-09 08:25:01
【问题描述】:

对于为什么我从未点击下面的GETNEARCALLBACK 函数,我感到很困惑。逻辑是这样的:

  1. 在页面加载时我打电话给INITIALIZE
  2. INITIALIZE 愉快地执行并调用GETSTATIONS
  3. GETSTATIONS 使用 GETNEARESTSTAIONS 作为回调函数执行 AJAX 请求,Web 服务器以 JSON 格式的数据库查询结果进行响应。
  4. GETNEARESTSTAIONS 获取结果并使用 GETNEARCALLBACK 作为回调函数创建 Google Maps API 距离矩阵请求
  5. 我运行我的站点并使用 Firebug 确定我永远无法访问GETNEARCALLBACK

我认为我对 Google Maps API 的使用是正确的,因为如果我不在我的 AJAX 请求中调用 GETNEARESTSTATIONS,它就会正确执行。

函数初始化(){ 获取位置(); 绘图(); GETADDR(); GETSTATIONS(); }

var xmlhttp;

function GETSTATIONS() {
  if(window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
  } else {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange = GETNEARESTSTATION();
  xmlhttp.open("GET", "final.php", true);
  xmlhttp.send();
}

var STATIONLIST;

function GETNEARESTSTATION() {
  if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    STATIONLIST = eval("(" + xmlhttp.responseText + ")");
    var LAT = parseFloat(document.getElementById("LATITUDE").value);
    var LON = parseFloat(document.getElementById("LONGITUDE").value);
    var latlng = new google.maps.LatLng(LAT, LON);
    var destinationA = STATIONLIST[0].ADDRESS;
    var service = new google.maps.DistanceMatrixService();
    service.getDistanceMatrix({
      origins: [latlng],
      destinations: [destinationA],
      travelMode: google.maps.TravelMode.DRIVING,
      unitSystem: google.maps.UnitSystem.IMPERIAL,
      avoidHighways: false,
      avoidTolls: false
    }, GETNEARCALLBACK);
  }
}

function GETNEARCALLBACK(response, status) {
  if(status == google.maps.DistanceMatrixStatus.OK) {
    var destinations = response.destinationAddresses;
    var results = response.rows[0].elements;
    for(var j = 0; j < results.length; j++) {
      var element = results[j];
      document.getElementById("STATIONADDR").innerHTML = parseFloat(element.distance.value) + " " + response.destinationAddresses[j];
    }
  }
}

【问题讨论】:

  • 函数名称全部大写有什么特殊原因吗?读起来很不愉快。
  • console.log 在if 语句中检查readyState 值和status 值之前...你会得到什么?

标签: javascript ajax google-maps-api-3


【解决方案1】:

需要函数变量,而不是函数返回值

//xmlhttp.onreadystatechange = GETNEARESTSTATION(); //error
xmlhttp.onreadystatechange = GETNEARESTSTATION; 

【讨论】:

  • 很好,当您尝试多种不同的编辑来调试代码时会发生这种情况。我验证了 readystate 和 status 现在分别是 4 和 200,并且我确实进入了那个 if 子句。但是,仍然没有进入 GETNEARCALLBACK。很抱歉用帽子惹恼了任何人。
  • 嗯,实际上,在我进行了这些更改之后,我关闭并重新打开了浏览器,现在它可以工作了。谢谢!!!