0

我是 OOP 的新手,我尝试使用 ajax 请求构建一个对象。我需要的是获取 JSON 格式的“responseArray”,然后进行处理。

function adres(adres) {

this.adres_string = adres;
var self = this
$.ajax({
    type: 'POST',
    url: "http://nominatim.openstreetmap.org/search?q="+adres+"&format=json&polygon=0&addressdetails=0",
    success: function(data) {
        self.responseArray = eval('(' + data + ')')

    }

})


//Method returning point coordinates in EPSG:4326 system
this.getLonLat = function() {

    var lonlat = new OpenLayers.LonLat(this.responseArray.lon, this.responseArray.lat);
    return lonlat;

}
}

当我在应用程序代码中编写时,问题就开始了:

var adr = new adres('Zimna 3, Warszawa');
adr.getLonLat();

这不会返回任何内容,因为没有时间从服务器获取响应。如何以最好的方式正确编写它?我读过 jQuery 中的 when().then() 方法。这对我来说可能没问题。我只想了解最佳实践

4

1 回答 1

1

这就是 AJAX 的工作方式(注意A同步部分)。你是对的,你呼叫adr.getLonLat()响应的那一刻还没有回来。这是我建议的设计:只需将回调函数引用传递给adres构造函数:

function adres(adres, callbackFun) {
  //...
  success: function(data) {
    var responseArray = eval('(' + data + ')')
    var lonlat = new OpenLayers.LonLat(responseArray[i].lon, responseArray[i].lat);
    callbackFun(lonlat)
}

并这样称呼它:

adres('Zimna 3, Warszawa', function(lonlat) {
  //...
})

几点说明:

  • adres现在基本上是一个函数,你在这里不需要一个对象。

  • eval用于解析 JSON,使用JSON对象。

  • 你确定你可以 POST 到http://nominatim.openstreetmap.org? 您可能会遇到相同的原产地政策问题

  • i变量来自哪里responseArray[i]

于 2012-08-26T17:17:55.887 回答