处理AJAJ的返回值

时间:2017-05-09 08:29:54

标签: javascript json asynchronous leaflet

我最近一直在摆弄Leaflet和不同的地图。我目前正在尝试使用onClick事件创建的标记来显示从API提供的JSON查询中解析的当前地址。

我正在成功解析JSON查询中的地址(控制台登录onMapClick(e)的getAddress)。但是我想要做的是从回调(?)函数返回这个值,并将其作为标记的内容显示。

function getAddress(lat, lon, callback) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://api.digitransit.fi/geocoding/v1/reverse?point.lat=' + lat + '&point.lon=' + lon + '&size=1', true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
      if (typeof callback == "function") {
        callback.apply(xhr);
      }
    }
  }
  xhr.send();
}

function onMapClick(e) {
  popup
    .setLatLng(e.latlng)
    .setContent("Address is " +
      getAddress(e.latlng.lat, e.latlng.lng, function() {
        var resp = JSON.parse(this.responseText);
        console.log(resp.features[0].properties.label); //This gives the correct current address in console
        return resp.features[0].properties.label; //This SHOULD return the correct address, verified with the console log, and replace the function call in the marker's content window, however the address appears always as undefined.
      }))
    .openOn(map);
}

1 个答案:

答案 0 :(得分:0)

更改执行顺序,以便在实际从API异步返回时使用该值:

function onMapClick(e) {
  getAddress(e.latlng.lat, e.latlng.lng, function() {
    var resp = JSON.parse(this.responseText);
    popup
      .setLatLng(e.latlng)
      .setContent("Address is " + resp.features[0].properties.label)
      .openOn(map);
  });
}