Hallo, ich bin noch ziemlich neu in Ajax und hab ein Problem mit der asynchronität.
Ich möchte einen Wert von einer Funktion abfragen und falls dieser Wert noch nicht vorhanden ist, soll ein Request gestellt werden(Traffikminimierung).
Das ganze in Pseudocode:
Das Problem ist jetzt, das doB() eher "undefined" zurückgibt, bevor die Funktion doAjaxRequest() das x gesetzt hat.
Vielleicht hilft die lange Version weiter um mein Problem zu verstehen:
Hauptklasse:
Hier soll nun mit der Zeile
die URL des Fotos in der ursprünglichen Größe abgefragt werden. Dieser Wert kommt allerdings in der ersten Abfrage nicht mit und somit muss eine zweite Anfrage gestellt werden.
Hier mal mein FotoFlickr-Klasse;
Und die Klasse FlickrFotoInfo
Ich möchte einen Wert von einer Funktion abfragen und falls dieser Wert noch nicht vorhanden ist, soll ein Request gestellt werden(Traffikminimierung).
Das ganze in Pseudocode:
Code:
doA : function(){
return "bla" + this.doB();
}
doB : function(){
if (x == null) {
this.doAjaxRequest();
}
return x;
}
doAjaxRequest : function(){
...
onSuccess: function(transport) {
...
this.x = json.x;
}
}
Das Problem ist jetzt, das doB() eher "undefined" zurückgibt, bevor die Funktion doAjaxRequest() das x gesetzt hat.
Vielleicht hilft die lange Version weiter um mein Problem zu verstehen:
Hauptklasse:
Code:
_doGetFotos : function() {
// Erstellen der URL für die Anfrage
...
// Starten der Anfrage als Ajax-Request
new Ajax.Request(url, {
// Benutze das get-Protokoll für die Anfrage
method: 'get',
// Wenn erfolgreich -> führe Aktion aus
onSuccess: function(transport) {
try {
function jsonFlickrApi(json){
if (json.stat != "ok"){
// something broke!
return;
}
for (i in json.photos.photo) {
if (typeof json.photos.photo[i] == 'object') {
var foto = new FlickrFoto(json.photos.photo[i].id, json.photos.photo[i].owner, json.photos.photo[i].secret, json.photos.photo[i].server, json.photos.photo[i].farm, json.photos.photo[i].title, json.photos.photo[i].ispublic, json.photos.photo[i].isfriend, json.photos.photo[i].isfamily);
GeotaggingShowFotos.flickrFotos.push(foto);
}
}
alert(GeotaggingShowFotos.flickrFotos.length);
var url = GeotaggingShowFotos.flickrFotos[0].doGetOriginalURL();
alert(url);
}
eval(transport.responseText);
} catch(e) {
alert('eval: Ungültiges JSON: ' + e);
return;
}
}
});
},
Hier soll nun mit der Zeile
Code:
var url = GeotaggingShowFotos.flickrFotos[0].doGetOriginalURL();
Hier mal mein FotoFlickr-Klasse;
Code:
var FlickrFoto = Class.create();
FlickrFoto.prototype = {
initialize : function(id, owner, secret, server, farm, title, ispublic, isfriend, isfamily) {
this.id = id;
this.owner = owner;
this.secret = secret;
this.server = server;
this.farm = farm;
this.title = title;
this.ispublic = ispublic;
this.isfriend = isfriend;
this.isfamily = isfamily;
this.infos = null;
},
doGetOriginalURL : function() {
return "http://farm" + this.farm + ".static.flickr.com/" + this.server + "/" + this.id + "_" + this._doGetOSecret() + "_o.jpg";
},
_doGetOSecret : function() {
if (this.infos == null){
this.infos = new FlickrFotoInfos(this.id, this.secret, this);
}
return this.infos.originalsecret;
}
};
Und die Klasse FlickrFotoInfo
Code:
var FlickrFotoInfos = Class.create();
FlickrFotoInfos.prototype = {
initialize : function(id, secret) {
this._doGetFotoInfos(id, secret, flickrFoto);
},
_doGetFotoInfos : function(id, secret, flickrFoto) {
// Erstellen der URL
...
// Starten der Anfrage als Ajax-Request
new Ajax.Request(url, {
// Benutze das get-Protokoll für die Anfrage
method: 'get',
// Wenn erfolgreich -> führe Aktion aus
onSuccess: function(transport) {
try {
function jsonFlickrApi(json){
if (json.stat != "ok"){
// something broke!
return;
}
this.originalsecret = json.photo.originalsecret;
}
eval(transport.responseText);
} catch(e) {
alert('eval: Ungültiges JSON: ' + e);
return;
}
}
});
}
};