Wie das Ergebnis von Request zurückgeben?
wucher wichtel
- javascript
0 Cheatah
Hallo!
Ich habe ein kleines Problem mit JavaScript. Und zwar mache ich mit AJAX einen Request. Das ist auch kein Problem, und es funktioniert alles. Allerdings habe ich ein Problem dabei, das Ergebnis des Requests mit return zurückzuliefern. Hier mal ein Ausschnitt des Quelltextes (ich hoffe er zeigt, was ich versucht habe, und was ich meine):
request.open('GET', url, true);
request.send(null);
var test = request.responseText;
alert(test); // Hier überprüfe ich mit alert. Später soll mit return
// das Ergebnis wieder zurückgeschickt werden.
Das Ergebnis ist gar nichts. Die alert-Box ist leer.
Könntet ihr mir vielleicht auf die Sprünge helfen, wie ich das hinbekomme? Vielen Dank!
ciao, ww
Hi,
Ich habe ein kleines Problem mit JavaScript. Und zwar mache ich mit AJAX einen Request.
für was steht das erste "A"?
request.open('GET', url, true);
request.send(null);
var test = request.responseText;
> Das Ergebnis ist gar nichts.
Das Ergebnis eines asynchronen Requests, den Du hier sogar \_explizit\_ gewählt hast, ist erst Jahre (na gut, vielleicht auch Sekunden) nach dem Absenden desselben verfügbar. Definitiv ist er es \*nicht\* in der nächsten Code-Zeile. So schnell kann das Ergebnis nicht mal aus dem Cache gelesen werden.
> Könntet ihr mir vielleicht auf die Sprünge helfen, wie ich das hinbekomme?
Mach Dich noch mal über das Event-Handling schlau, das bei AJAX benötigt wird.
Cheatah
--
X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
X-Will-Answer-Email: No
X-Please-Search-Archive-First: Absolutely Yes
Hallo!
Danke für deine Antwort. Der Fehler, ist mir beim Umstellen und Rumprobieren mit dem Quelltext unterlaufen. Danke für den Hinweis.
Allerdings weiß ich trotzdem nicht, wie ich mein Problem lösen kann.
request.onreadystatechange = // Hier wird ja eine Funktion erwartet
Ich kann entweder eine Funktion aufrufen, oder eine anonyme (heißt doch so, oder?) Funktion schreiben.
function foo(){ // hat die Funktion für den Request gestartet und
bar(); // erwartet einen Rückgabewert (den responseText)
}
function bar(){ // macht den Request und ruft baz() auf
return baz('test'); //[1] wie soll ich dieses return schreiben?
}
function baz(text){ // verarbeitet den responseText
return text;
}
Das Problem ist, dass ich nicht weiß, wie ich das erste ([1]) return schreiben soll.
Der responseText wird von baz() an bar() zurückgegeben. Aber wie soll bar() an foo() "antworten"?
Wie kann ich den responseText, ausgelöst durch onreadystatechange, an die erste Funktion (foo()) schicken?
Vielen Dank für deine Hilfe! Ich werde später antworten, da ich jetzt ins Training muss. Danke!
ciao, ww
Hi,
Ich kann entweder eine Funktion aufrufen,
Funktionsreferenz übergeben, meinst Du vermutlich. Eine Funktion kannst Du hier zwar auch aufrufen, allerdings wird dann dessen Rückgabe im Event-Handler gespeichert und beim Eintreten des Events aufgerufen.
oder eine anonyme (heißt doch so, oder?) Funktion schreiben.
Ja, heißt so.
function foo(){ // hat die Funktion für den Request gestartet und
bar(); // erwartet einen Rückgabewert (den responseText)
Stoppoppopp. Die Funktion wird weder er- noch warten. Sie läuft weiter, und Stunden später ist dann mal der Response da. Diese Funktion wird davon aber nichts mitkriegen.
function bar(){ // macht den Request und ruft baz() auf
Wer genau ruft jetzt request.open() auf, foo() oder bar()?
return baz('test'); //[1] wie soll ich dieses return schreiben?
Gar nicht. Ein return bringt Dir nichts. Im Falle des Events "Response ist da" wird diejenige Funktion gestartet, die mit dem Response arbeiten soll.
Wie kann ich den responseText, ausgelöst durch onreadystatechange, an die erste Funktion (foo()) schicken?
Die Syntax dazu lautet "foo(responseText)" :-)
Vielen Dank für deine Hilfe! Ich werde später antworten, da ich jetzt ins Training muss. Danke!
Wünsche wohl trainiert zu haben!
Cheatah
Hallo!
Funktionsreferenz
Das Wort habe ich gesucht.
function bar(){ // macht den Request und ruft baz() auf
Wer genau ruft jetzt request.open() auf, foo() oder bar()?
foo() ruft bar() auf. Und bar() führt den Request aus :-)
return baz('test'); //[1] wie soll ich dieses return schreiben?
Gar nicht. Ein return bringt Dir nichts. Im Falle des Events "Response ist da" wird diejenige Funktion gestartet, die mit dem Response arbeiten soll.
Ok, dann war mein kompletter Ansatz falsch.
Wie kann ich den responseText, ausgelöst durch onreadystatechange, an die erste Funktion (foo()) schicken?
Die Syntax dazu lautet "foo(responseText)" :-)
Hehe... Ok ;-)
Vielen Dank für deine Hilfe! Ich werde später antworten, da ich jetzt ins Training muss. Danke!
Wünsche wohl trainiert zu haben!
Danke :)
Also, ich habe jetzt die meisten Probleme nun gelöst. Allerdings habe ich noch eines. Und zwar soll die Funktion, die den Request abschickt, wiederverwendbar sein. Also ich möchte bei 20 verschiedenen Aufgaben (pro Aufgabe eine Funktion, die die Request-Funktion aufruft), jeweils ein anderes Ergebnis, an eine andere Funktion, zurückgeliefert bekommen. Wie kann ich das flexibel machen?
So sieht das Script aus:
foo() - Es kann viele ähnliche Funktionen geben, die dann immer request() aufrufen. Also es kann foo1(), foo2(), fooxy() geben. Alle sollen die Funktion request mit einigen Parametern aufrufen und dann das Ergebnis zurückbekommen, das der Server liefert.
request() - führt den Request aus, und ruft die Funktion checkResponse(), mit dem Parameter textResponse auf
checkResponse() - Überprüft readyState und status. Wenn alles gut ist, dann wird textResponse zurückgegeben.
Also wenn foo1() request() aufruft, dann soll das Ergebnis auch an foo1() zurückgeliefert werden. Wenn fooxy() request aufruft, dann soll das Ergebnis auch an fooxy() zurückgeliefert werden.
Ich hoffe, dass nun klar ist, was ich meine. Gibt es andere, bessere Möglichkeiten oder wie kann ich mein Problem lösen? Soll ich (mehr) Code zeigen? Ist irgendetwas unklar?
Danke schön schonmal für deine/eure Hilfe :)
ciao, ww
Hallo!
Also, ich mache mich jetzt nochmal dran, eine einfachere Problembeschreibung zu schreiben :)
Meine Ajax-Funktion soll von vielen verschiedenen Funktionen aufgerufen werden können. Das Problem ist, dass ich per
request.onreadystatechange = checkResponse;
function checkResponse(){
// status und readyState werden überprüft.
dynamischerName(http_request.responseText);
}
nicht dynamisch den Namen der Funktion vergeben, an den der responseText geschickt werden soll.
Lässt sich das irgendwie regeln? Ich ahne schon böses und schaue mich nach einem anderen Weg um :( Wenn jemand einen kennt und diesen posten würde, dann wäre ich auch dankbar.
Danke!
ciao, ww
request.onreadystatechange = checkResponse;
function checkResponse(){
// status und readyState werden überprüft.
dynamischerName(http_request.responseText);
}
>
> nicht dynamisch den Namen der Funktion vergeben, an den der responseText geschickt werden soll.
Wieso solltest du nicht dynamisch den Namen vergeben können?
Du kannst der Funktion, die den AJAX Aufruf erzeugt eine callback Funktion übergeben, die dann im Erfolgsfall aufgerufen wird.
Struppi.
Hallo!
Wieso solltest du nicht dynamisch den Namen vergeben können?
Du kannst der Funktion, die den AJAX Aufruf erzeugt eine callback Funktion übergeben, die dann im Erfolgsfall aufgerufen wird.
callback-Funktion habe ich zwar schon gehört, aber ich weiß nicht, wie man das umsetzt. Ich habe bei Google und Wikipedia nichts hilfreiches gefunden. Wie schreibt man eine solche Funktion, wie ruft man diese auf?
Danke für deine Antwort!
ciao, ww
callback-Funktion habe ich zwar schon gehört, aber ich weiß nicht, wie man das umsetzt. Ich habe bei Google und Wikipedia nichts hilfreiches gefunden. Wie schreibt man eine solche Funktion, wie ruft man diese auf?
Danke für deine Antwort!
function test( callback ) {
if(typeof callback == 'function') callback();
}
function myFunc(){
alert('Hallo!');
}
test( myFunc );
Struppi.
Hallo!
Danke für das Beispiel. Ich glaube, dass ich es jetzt verstanden habe :) Allerdings gibt es noch ein Problem, das ich nicht so ganz nachvollziehen kann. Ich poste hier mal den Quelltext. Als alert wird immer nur "1" ausgegeben. Dabei sollten doch eigentlich noch mehr alerts kommen.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="STYLESHEET" type="text/css" href="css.css">
<script type="text/javascript">
~~~~~~javascript
function original_size(response){
if(response == null){
setRequest('original_size');
alert("1");
} else if(response != ''){
alert("2");
} else {
alert("Leider gab es einen Fehler!");
}
}
function setRequest(url) {
var callback = url;
checkResponse(callback);
}
function checkResponse(callback){
if(typeof callback == 'function'){
callback("responseText");
alert("Funktion wurde aufgerufen");
}
}
~~~~~~html
</script>
</head>
<body id="body">
<a href="#" onclick="original_size()">test</a>
<div id="test">
</div>
</body>
</html>
Warum wird die Funktion original_size() mit dem Callback nicht aufgerufen? Das alert wird ja auch nicht ausgegeben...
Danke für deine Hilfe!
ciao, ww
function setRequest(url) {
var callback = url;
checkResponse(callback);
Ich kann nicht erkenne, was in url steht, aber die Bezeichnung url deutet daraufhin, dass es keine Funktionsreferenz ist.
Was ergibt denn alert(callback);
Struppi.
Hallo!
Ich kann nicht erkenne, was in url steht,
Die Funktion setRequest() wird doch im ersten if-Teil der Funktion original_size() aufgerufen. Und zwar mit dem Parameter 'original_size': setRequest('original_size');
aber die Bezeichnung url deutet daraufhin, dass es keine Funktionsreferenz ist.
Der Name ist ungünstig gewählt :-|
Was ergibt denn alert(callback);
original_size
Also es ist schon der Name der Funktion. Aber sie wird trotzdem nicht aufgerufen.
ciao, ww
Ich kann nicht erkenne, was in url steht,
Die Funktion setRequest() wird doch im ersten if-Teil der Funktion original_size() aufgerufen. Und zwar mit dem Parameter 'original_size': setRequest('original_size');
Jetzt sehe ich. Das was du willst ist ziemlich ungünstig, eine callback Funktion die sich selbst aufruft ist so nicht üblich (auch wenn es geht).
Aber dein Problem ist, dass du mein Beispiel nicht verstanden hast, du sollst keinen String übergeben, sondern die Referenz auf die Funktion.
Was ergibt denn alert(callback);
original_size
Das ist keine Funktion, nur ein String.
Mach mal, des Verständnis wegen, ein alert(original_size);
Struppi.
Hallo!
Jetzt sehe ich. Das was du willst ist ziemlich ungünstig,
Warum ist das ungünstig?
eine callback Funktion die sich selbst aufruft ist so nicht üblich
Warum? Wie sollte ich es sonst lösen? Das ist IMHO die einzige Möglichkeit, die ich hier habe.
Mach mal, des Verständnis wegen, ein alert(original_size);
Ei, was zwei solche kleine Striche (') ausmachen können. Auf jeden Fall vielen vielen Dank! Jetzt klappt es wunderbar!
ciao, ww
Jetzt sehe ich. Das was du willst ist ziemlich ungünstig,
Warum ist das ungünstig?
eine callback Funktion die sich selbst aufruft ist so nicht üblich
Warum? Wie sollte ich es sonst lösen? Das ist IMHO die einzige Möglichkeit, die ich hier habe.
Nein, du irrst.
Hier mal ein rudimentäres HTTPRequest Objekt, das unterschiedliche calback Funktionen aufrufen kann.
function myReq(url, callback) {
var http_request = false;
if (window.XMLHttpRequest) http_request = new XMLHttpRequest();
else if (window.ActiveXObject) http_request = new ActiveXObject("Microsoft.XMLHTTP");
http_request.onreadystatechange = function() {
if (http_request.readyState == 4) {
if(typeof callback == 'function') callback( http_request );
return;
}
};
http_request.open('GET', url, true);
http_request.send(null);
}
Das kannst du jetzt beliebig aufrufen:
function text( req) {
alert(req.responseText);
}
function state( req) {
alert(req.reeadyState);
}
myReq(' ... url ', text);
oder
myReq(' ... url ', state);
oder
myReq(' ... url ', function(r) {alert(r);});
usw.
Struppi.
Hallo!
Nochmals Danke schön! Ich werde es mir später anschauen, da ich jetzt weg muss. Danke!
ciao, ww
Hallo!
Vielen Dank für deine Hilfe! Ich habe wieder einiges gelernt und das Problem ist gelöst :) Danke!
ciao, ww