使用AJAX设置对象属性

时间:2012-08-26 17:10:23

标签: javascript ajax oop jquery

我是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;

}
}

问题在我写的appilcation代码中开始:

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

由于没有时间从服务器获取响应,因此不返回任何内容。 如何以最佳方式正确编写?我已经阅读了jQuery中的when()。then()方法。这对我来说可能没问题。我只是想知道最佳实践

1 个答案:

答案 0 :(得分: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对象。

  • 您确定可以发布到http://nominatim.openstreetmap.org吗?您可能会遇到相同的原始政策问题

  • 来自i的{​​{1}}变量在哪里?