JQUERY $.ajax
Can
- javascript
0 Matti Mäkitalo0 molily
Hallo,
ich hätte eine Frage. Mein Problem ist, dass
ich einer variable den Wert übergeben will, der bei einem Ajax-Request zurückgegeben wird.
function bla(){
var xy = getIt();
console.log(xy);
}
function getIt(){
$.ajax({
...
}).done(function(data){
return data;
});
}
Ich hoffe das Problem wird klar. Ajax läuft ja asyncron...
Deshalb bekomme ich bei console.log nichts heraus.
Wie kann ich das umgehen? Kann ich es so einstellen,
dass das Programm den Ajax abwartet? async false vllt..
Habe es schon probiert, aber vllt habe ich es falsch.
Ich hatte dann einfach folgendes gehabt:
$.ajax({
async : false,
})
Danke im voraus.
Hi,
function bla(){
var xy = getIt();
console.log(xy);
}function getIt(){
$.ajax({
...
}).done(function(data){
return data;
});
}
selbst wenn du hier async auf false setzt, liefert getIt nicht data zurück (sondern nur die anonyme Funktion, die du als Event-Handler für das Ereignis "done" übergibst. Eine Möglichkeit wäre (ungetestet!)
~~~javascript
function getIt() {
var ret;
$.ajax({
// …
async: false
}).done(function(data){
ret = data;
});
return ret;
}
Ich würde dir aber empfehlen, eher beim asynchronen Zeugs zu bleiben und dich mit dessen Konzepten auseinanderzusetzen:
function bla(){
var myDoneHandler = function(xy) {
console.log(xy);
};
getIt(myDoneHandler);
}
function getIt(handler) {
$.ajax({
// …
}).done(handler);
}
oder auch eine anonyme Funktion, die du done gibst, welche die Daten aufbereitet und dann deinen Done-Handler (den von bla()) entsprechend aufbereitet.
Bis die Tage,
Matti
Hallo,
function bla(){
var xy = getIt();
console.log(xy);
}
Das geht nicht und den Request auf synchron umstellen ist i.d.R. keine gute Idee.
Arbeite mit einer Callback-Funktion, die beim Eintrudeln der Serverantwort ausgeführt wird. Oder besser noch, gib in getIt das [link:http://api.jquery.com/jQuery.ajax/#jqXHR@title=jqXHR-Objekt] zurück, welches $.ajax() erzeugt:
[code lang=javascript]function getIt() {
return $.ajax({
...
});
}
Dann kannst du Erfolgs- und Fehlerhandler dort registrieren, wo du die Antwort verarbeiten willst:
~~~javascript
function bla() {
getIt.done(function (data) {
...
}).fail(function () {
...
});
}
Dieses jqXHR-Objekt ist ein Promise. Das ist ein Programmier-Pattern, das sich für viele asynchrone Einsatzzwecke eignet.
Mathias