Javascript 使用AJAX设置对象属性

Javascript 使用AJAX设置对象属性,javascript,ajax,oop,jquery,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&polygo

我是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()方法。这对我来说可能没问题。我只是想了解一下最佳实践

这就是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
    object

  • 您确定可以发布到
    http://nominatim.openstreetmap.org
    ?您可能会遇到同一原产地政策问题

  • responseArray[i]
    中的
    i
    变量在哪里


谢谢!我使用eval和“I”,因为这个代码snipset只是从更大的部分中提取出来的。有可能返回多个对象。我只是忘了删除[I](刚刚编辑了我的问题)。提名的ToS不是很受限制@Odoakr:我的意思是说,关于ToS或法律方面的东西没有什么限制。对不起,我没有得到它。这只是为了测试。如果我决定基于Namingm编写一个应用程序,我会在我的server.BWT上安装这个实例,如何以完全面向对象的方式编码它(我正在学习:))我坚持这样做,因为我有更多的方法要添加:变换坐标、平移和缩放地图等等…@Odoakr:问题是,当你的对象被构造时,它还没有准备好使用,因为AJAX请求仍然没有到达。我建议使用一个接受回调的工厂方法。此回调将接收完全创建的对象:
adres.create(函数(newInstance){…})
。不漂亮,但很管用。