Обратный вызов AJAX в конструкторе Obj - PullRequest
1 голос
/ 19 апреля 2010

У меня есть объект класса с именем 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, поскольку он выполнен через API Google.

Я хочу быть уверен, что this.coord[] правильно инициализирован после создания объекта Location.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 19 апреля 2010

Нет, вы не можете (читай: не должны) ждать. Вот почему он называется AJAX («Асинхронный 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());
});
0 голосов
/ 19 апреля 2010

Можно ли дождаться ответа от Google перед выходом из конструктор?

Я бы не рекомендовал такой подход. Когда вы создаете объект JavaScript, вы обычно не ожидаете, что он будет блокироваться в течение сотен миллисекунд, пока Google не ответит.

Кроме того, Google будет ограничивать GClientGeocoder, если вы пытаетесь делать частые запросы ( Источник ). Существует также ограничение на количество запросов, которые клиент может выполнить за 24 часа. Это было бы сложно систематически обрабатывать с использованием этого подхода. Вы можете легко попасть в кошмар отладки, если у вас будут JavaScript-объекты, которые не работают случайно.

...