Font
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10828[/thread]

asynchrones ajax und zwischenergebnis

Reader: 1


<< |< 1 2 >| >> 20 entries, 2 pages
Froschpopo
 2007-11-19 15:37
#102580 #102580
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
Folgendes Problem:

Ich arbeite mit XMLHttpRequest einen Request asynchron ab. D.h. wenn eine URL über Ajax angefordert wird, arbeitet das Script normal weiter ohne auf das Callback zu warten.

Nun habe ich folgendes Szenario:
Die Ziel-Seite liefert entweder 1 oder 0 zurück. Wahr, wenn die Aufgabe erfolgreich war.
Ich möchte in meinem Script aber nur eine einzige Ajaxfunktion haben die ich dann mehr order weniger Objektorientiert nutzen will, also von mehreren Funktionen.
Ich hatte jetzt die Idee, dass die Ajaxfunktion einen return-Status zurückgibt. Also 1 oder 0 einfach an die aufrufende Funktion zurückgibt.

Aber genau hier kommt das Problem mit der asynchronen Arbeitsweise, nämlich dass die aufrufender Funktion nicht wartet, bis Ajaxfunktion den Status zurückgibt.

Ich habe eigentlich auch garnichts gegen diese Vorgehensweise, denn sie ist schnell !
Ich weiss blos im Moment nicht weiter.
renee
 2007-11-19 15:46
#102582 #102582
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Vielleicht solltest Du mal genauer erläutern was Du machen willst und wie die Anwendung grob aufgebaut ist...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
GwenDragon
 2007-11-19 15:50
#102583 #102583
User since
2005-01-17
14711 articles
Admin1
[Homepage]
user image
Froschpopo+2007-11-19 14:37:14--

Aber genau hier kommt das Problem mit der asynchronen Arbeitsweise, nämlich dass die aufrufender Funktion nicht wartet, bis Ajaxfunktion den Status zurückgibt.

Aber für asynchrones ist Ajax (=Asynchronous JavaScript and XML) genau da! Synchron geht es aber auch.

http://www.teialehrbuch.de/Kostenlose-Kurse/AJAX/2...
Froschpopo
 2007-11-19 15:53
#102584 #102584
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function AjaxRequest(adresse, id) {

var req = null;
try{
req = new XMLHttpRequest();
} catch (ms){
try{
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch (nonms){
try{
req = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed){
req = null;
}
}
}

if (req == null)
alert("Error creating request object!");
req.open("GET", adresse, true);

req.onreadystatechange = function() {
switch(req.readyState) {
case 4:
if(req.status!=200) {
alert("Fehler:"+req.status);
}else{
document.getElementById(id).innerHTML = req.responseText;

}
break;

default:
return false;
break;
}
};

req.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
req.send(null);
}


Was ich machen will ist im Grunde folgendes:
Ich möchte die Zielseite die durch den AjaxRequest ermittelt wurde vorher auswerten, bevor ich sie mit innerHTML ans Dokument weitergebe.

Das könnte z.B. so aussehen:
Angenommen die Zielseite (adresse) darf nur von authorisierten Usern ausgeführt werden. Ob jemand authorisiert ist, wird aber erst bei adresse ermittelt. Das Callback wäre dann 1 oder 0.
Wie kann ich jetzt in AjaxRequest ein alert() ausgeben, wenn das Ergebnis 0 ist?

Also quasi sowas wie das hier:

Code: (dl )
1
2
if (req.responseText == 0)
alert("Du bist nicht berechtigt die Seite anzufordern");


Ein "return 0" hab ich mir ja mittlerweile schon fast abgeschminkt. Glaub sowas ist echt nicht möglich bei asynchroner arbeitsweise.
Was ja noch cooler wäre, wenn ich einfach "forbidden" als HTTP-Status zurückliefere, aber ich befürchte hier Browser-Probleme.
Struppi
 2007-11-19 16:25
#102586 #102586
User since
2006-02-17
628 articles
BenutzerIn
[Homepage]
user image
Dafür ist die onreadystatechange Funktion da, genau dort erfährst du was der Request zurück gibt und das sogar in mehreren Stufen
GwenDragon
 2007-11-19 17:24
#102589 #102589
User since
2005-01-17
14711 articles
Admin1
[Homepage]
user image
Quote
Das könnte z.B. so aussehen:
Angenommen die Zielseite (adresse) darf nur von authorisierten Usern ausgeführt werden. Ob jemand authorisiert ist, wird aber erst bei adresse ermittelt. Das Callback wäre dann 1 oder 0.
Wie kann ich jetzt in AjaxRequest ein alert() ausgeben, wenn das Ergebnis 0 ist?
Wenn du per JS prüfst, ob jemand die Seite sehen darf, dann kann das übergangen werden.
Froschpopo
 2007-11-19 17:27
#102590 #102590
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
das wär ja doppelt gemoppelt, weil, wenn er die seite sehen darf, wird ja direkt nochmal der request durchgeführt, diesmal auf ajax-ebene.

Ich hab aber grad mal req.responseText gecheckt, das ist scheinbar tatsächlich die einzige methode um an die seite ranzukommen.
Struppi
 2007-11-19 19:10
#102599 #102599
User since
2006-02-17
628 articles
BenutzerIn
[Homepage]
user image
Hast du auch mal req.readyState und oder req.status gecheckt?
Mir ist nicht so ganz klar was du wikrlich willst, aber in den Eigenschaften stecken noch andere Informationen über den Request. Dein obiger Code fragt ja nur einen Status ab, es gibt aber noch mehr.
Froschpopo
 2007-11-19 19:21
#102600 #102600
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
mach ich doch, ich prüfe ja sogar mit req.status den HTTP-Header auf Wert 200.
Es gibt aber leider keine weiteren readyState's die sich auch auf den Inhalt beziehen.
readyState bezieht sich meines Wissens nach nur auf den Request, also welchen HTTP-Status er hat, ob er vollständig ist, ob initialisiert oder ob er geladen wird.
An den Inhalt kommt man scheinbar nur mit req.responseText ran. Aber ich lass mich auch gern belehren.

readyState 1 kann man ganz gut nutzen für diese typischen ajax activity indicator icons... hab jetzt dafür auch noch ein case angelegt.
Struppi
 2007-11-19 19:22
#102601 #102601
User since
2006-02-17
628 articles
BenutzerIn
[Homepage]
user image
Froschpopo+2007-11-19 14:53:59--
Ein "return 0" hab ich mir ja mittlerweile schon fast abgeschminkt. Glaub sowas ist echt nicht möglich bei asynchroner arbeitsweise.
Was ja noch cooler wäre, wenn ich einfach "forbidden" als HTTP-Status zurückliefere, aber ich befürchte hier Browser-Probleme.

Was glaubst du macht diese Zeile: if(req.status!=200) ?
<< |< 1 2 >| >> 20 entries, 2 pages



View all threads created 2007-11-19 15:37.