Obj构造函数中的AJAX回调

时间:2010-04-19 17:08:06

标签: javascript ajax constructor geocoding gdata-api

我有一个名为Location的类对象,可与Google配合使用,以便对给定的地址进行地理编码。 地理编码请求通过AJAX调用进行,并通过回调处理,该回调将在响应到达时启动类成员。

以下是代码:

function Location(address) {
    this.geo = new GClientGeocoder();
    this.address = address;
    this.coord = [];

    var geoCallback = function(result) {
        this.coord[0] = result.Placemark[0].Point.coordinates[1];
        this.coord[1] = result.Placemark[0].Point.coordinates[0];
        window.alert("I am in geoCallback() lat: " + this.coord[0] + "; lon: " + this.coord[1]);
    }

    this.geo.getLocations(this.address, bind(this, geoCallback));                   
}
Location.prototype.getAddress = function() { return this.address; }
Location.prototype.getLat = function() { return this.coord[0] }
Location.prototype.getLng = function() { return this.coord[1] }

我的问题是:在退出构造函数之前,可以等待Google 的响应吗?

我无法控制AJAX请求,因为它是通过Google API制作的。

我希望确保在创建位置obj后正确初始化this.coord[]

谢谢!

2 个答案:

答案 0 :(得分:3)

不,你不能(读:不应该)等。这就是为什么它首先被称为AJAX(“Asynchronous Javascript ...”)。 ;)

您可以自己使用回调函数(未经测试的代码)。

function Location(address, readyCallback) {
  this.geo = new GClientGeocoder();
  this.address = address;
  this.coord = [];
  this.onready = readyCallback;

  this.geo.getLocations(this.address, bind(this, function(result) {
    this.coord[0] = result.Placemark[0].Point.coordinates[1];
    this.coord[1] = result.Placemark[0].Point.coordinates[0];
    if (typeof this.onready == "function") this.onready.apply(this);
  }));
}
Location.prototype.getAddress = function() { return this.address; }
Location.prototype.getLat = function() { return this.coord[0] }
Location.prototype.getLng = function() { return this.coord[1] }

// ... later ...

var l = new Location("Googleplex, Mountain View", function() {
  alert(this.getLat());
});

答案 1 :(得分:0)

  

是否可以等待回复   来自谷歌退出之前   构造

我不推荐这种方法。当您创建JavaScript对象时,通常不会期望它阻止数百毫秒,直到Google响应。

此外,如果您尝试频繁请求(Source),Google会限制GClientGeocoder。客户可以在24小时内完成的请求数量上限。使用这种方法系统地处理这将是复杂的。如果您将拥有随机失败的JavaScript对象,您可能很容易陷入调试噩梦。