• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Wiederholender Ajax Request mit jQuery

mikdoe

Moderator
Tachchen!

Baue gerade ein bisschen Code um und möchte wissen, wie man "sauber" und korrekt einen wiederkehrenden Ajax Request für jQuery baut. Er soll wiederkehren sowohl im Erfolgsfall als auch im Fehlerfall.
Als Beispiel hab ich mal einen für die Uhrzeit gebaut.

Ist das OK so?
Code:
function zeitholen () {
	jQuery.ajax ({
		url: 'test_jquery.pl',
		data: 'act=time',
		type: 'POST',
		cache: false,
		success: function (data) {
			jQuery('#insertzeit').html(data);
		}
	});
	window.setTimeout(function () {zeitholen();},2000);
}
zeitholen();

Es funktioniert exakt wie gewünscht.
Nur die Frage, ist das so in Ordnung oder gibt es eine bessere Variante?
 
Sieht nicht schlecht aus. Aber ich würde mit einem Interval arbeiten.
Danke für die Antwort.
Das hab ich bisher in diesem Zusammenhang gemieden, um zu verhindern, dass der Browser immer weiter versucht, obwohl ein Request vielleicht noch nicht endgültig fertig abgearbeitet ist.
Also wenn z.B. sekündlich aufgerufen wird und die Serverantwort dauert mal 2 Sekunden. Überschlägt sich der Browser dann nicht? Im IE8 hatte ich damit laufend böse Abstürze, allerdings hatte ich da kein jQuery benutzt.
Oder hab ich da was anderes falsch gemacht und die Sorge ist unbegründet?
 
Was hast du denn da im IE8 gemacht? Ev. ein globales XHR?
Jeder Browser sollte mehrere Requests gleichzeitig handhaben sollen.
 
Was hast du denn da im IE8 gemacht? Ev. ein globales XHR?
Weiß ich garnicht mehr so genau.
Wie arbeiten Browser soetwas denn ab?
Ich stelle mir vor, dass die bei jedem Eintritt von setInterval loslegen. Und wenn dann noch der ein oder andere von vorher auf den Server wartet, was passiert dann genau im Browser?
 
Er sollte einfach weiterwarten. Du kannst ja auch in verschiedenen Tabs gleichzeitig zwei verschiedene Seiten (oder die gleiche zweimal) laden...
 
So wird es empfohlen:
HTML:
function zeitholen () {
	jQuery.ajax ({
		url: 'test_jquery.pl',
		data: 'act=time',
		type: 'POST',
		cache: false,
		success: function (data) {
			jQuery('#insertzeit').html(data);
			window.setTimeout(function () {zeitholen();},2000);
		}
	});
}
zeitholen();
 
Hmmm, ich dachte es wäre sinnvoll, nur im Erfolg den nächsten Request zu starten, daher dieser Aufbau. So wurde das damals mal in der alten Ajax Community raus gearbeitet. Was ist daran ungut oder zu verbessern?
 
Hmmm, ich dachte es wäre sinnvoll, nur im Erfolg den nächsten Request zu starten
Kann es natürlich sein. Das kommt immer auf den genauen Anwendungsfall ab.
Du hattest nur ganz oben:
Er soll wiederkehren sowohl im Erfolgsfall als auch im Fehlerfall.
geschrieben. Deswegen meine Anmerkung.

So wurde das damals mal in der alten Ajax Community raus gearbeitet. Was ist daran ungut oder zu verbessern?
Nur das mit der anonymen Funktion. Ansonsten ist das schon gut so. Wollte nur wissen, wer das so empfielt.
 
Kann es natürlich sein. Das kommt immer auf den genauen Anwendungsfall ab.
In welchem Fall ist es denn sinnvoll, es per Intervall zu machen unabhängig vom Ergebnis?

Du hattest nur ganz oben: geschrieben. Deswegen meine Anmerkung.
Stimmt, hatte ich übersehen und deshalb vergessen.
Neu:
HTML:
function zeitholen() {
	jQuery.ajax({
		url: 'test_jquery.pl',
		data: 'act=time',
		type: 'POST',
		cache: false,
		success: function(data) {
			jQuery('#insertzeit').html(data);
			window.setTimeout(function() {zeitholen();},2000);
		},
		error: function() {	// schief gegangen, etwas länger warten
			window.setTimeout(function() {zeitholen();},4000);
		}
	});
}
zeitholen();

Nur das mit der anonymen Funktion.
Hilf mir kurz auf die Sprünge bitte.
 
Julian, diese Schreibweise hab ich mir vor einiger Zeit extra abgewöhnt. Ist das wirklich, was Korbinian meint?
 
das kommt dabei raus wenn man stur regeln abarbeitet und nicht weiss warum
die (anonyme) funktion um zeitholen herum macht ja nur sinn, wenn man entweder dem eventhandler ein callback übergeben möchte, welches mehr/andere parameter erwartet als beim event übergeben werden oder um etwas zwischenzuspeichern.
in diesem fall erwartet setTimeout ein callback ohne parameter, zeitholen ist eine funktion ohne parameter, also kannst du sie direkt übergeben
 
Ah, verstehe, danke hesst. Allerdings hab ich in den Sachen die ich mache sonst keine Funktion ohne Parameter, mindestens den url und data Parameter hab ich nie statisch, daher brauche ich diese Schreibweise auch nicht. Mag daran vielleicht liegen.
 
Weiss nicht. Die kommt mir nicht bekannt vor. Aber kann sein, dass die vor langer Zeit auch mal dabei war :)
Ich bin halt kein gelernter Programmierer und kann vielfach mit den Fachbegriffen nichts anfangen. Wenn ich dann Code sehe kann ich das besser einordnen.
 
In welchem Fall ist es denn sinnvoll, es per Intervall zu machen unabhängig vom Ergebnis?
Wenn der Server z.B. nicht besonders verlässlich erreichbar ist.

Ist das wirklich, was Korbinian meint?
Ja, das meinte ich. Aber die anonyme Funktion ist nur unnötig. Problematisch ist sie nicht.

Und wenn du Parameter hast, ist die anonyme Funktion auch nicht notwendig, wenn du ältere IE (9 und älter) nicht benötigst: https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout https://html.spec.whatwg.org/multipage/webappapis.html#timers
 
Ah, diese neue Schreibweise sieht wegen weniger Klammern nach einer Vereinfachung für die Finger aus aber ob sie unbedingt logischer ist, weiß ich noch nicht. Wie seht ihr das?
 
Zurück
Oben