2010-04-19 7 views
1

J'ai un objet de classe appelé Location qui fonctionne avec Google afin de géocoder une adresse donnée. La requête de géocodage est effectuée via un appel AJAX et gérée via un rappel qui initiera les membres de la classe une fois la réponse arrivée.Callback AJAX dans le constructeur Obj

Voici le code:

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] } 

Ma question est: il est possible d'attendre la réponse de Google avant de quitter le constructeur?

Je n'ai aucun contrôle sur la requête AJAX car elle est faite à travers les API Google.

Je veux être sûr que this.coord[] est correctement initialisé une fois qu'un obj de lieu est créé.

Merci!

+0

A quoi servent ces propriétés? Chaque propriété que vous donnez ceci est publique. Vous pouvez facilement supprimer les getters et utiliser les propriétés directement (faites simplement des propriétés distinctes 'Lat' et 'Lng' au lieu d'un tableau' coord'). – Tomalak

Répondre

0

Est-il possible d'attendre la réponse de Google avant de quitter le constructeur ?

Je ne recommanderais pas cette approche. Lorsque vous créez un objet JavaScript, vous ne vous attendez normalement pas à le bloquer pendant des centaines de millisecondes, jusqu'à ce que Google réponde.

En outre, Google limitera le GClientGeocoder si vous tentez de faire des demandes fréquentes (Source). Il y a aussi un plafond pour le nombre de demandes qu'un client peut faire en 24 heures. Ce serait compliqué de gérer systématiquement cette approche. Vous pourriez facilement entrer dans un cauchemar de débogage si vous avez des objets JavaScript qui échouent au hasard.

3

Non, vous ne pouvez pas (lire: ne devrait pas) attendre. C'est pourquoi il s'appelle AJAX ("Asynchronous Javascript ...") en premier lieu. ;)

Vous pouvez utiliser vous-même une fonction de rappel (code non testé à venir).

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()); 
}); 
Questions connexes