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

Kann setIntervall führt zum Browsercrash

gsco

New member
Hallo Zusammen

Habe auf ein kleines Script geschrieben, dass über jquery externe daten abrufen soll
das sieht wie folgt aus:

HTML:
<script type="text/javascript">
							
	function empfangaufruf(){
		$.ajax({
			type: "POST",
			url: "inc/aj_inc/inc.tstatus.php",
			data: 	"tkey=asdflkeosew&dbuser=66",
			beforeSend: function(xhr){
				   $('#preloader').show();  
				   /*$('#recboxdata').hide();*/
			},
			success: function(html){
				/*$("#recboxdata").show();*/
				$("#recboxdata").html(html)
			},
			complete: function(xhr, textStatus){
				$('#preloader').hide(); 
		   }
		});
		
		}
</script>
Der externe Aufruf funktioniert einwandfrei.. das ist nicht das Problem.
Da ich den Status regelmässig abfragen möchte (alle 4 sek.) gehe ich wie folgt vor:

HTML:
<script type="text/javascript">
setInterval(function() {
	empfangaufruf()
}, 4000)
</script>


Nun zum Problem.
Wenn das läuft, dann stürzen sämtliche Browser auf meinem Mac ab... Nach spätestens 2 Minuten kann ich den Browser neu starten...

Wenn Der Status OK ist, dann braucht es den setIntervall ja nicht mehr.
Deswegen habe ich das dann so gemacht:

HTML:
<script type="text/javascript">
clearInterval(function() {
	empfangaufruf()
})
</script>


Der Browser möchte das aber nicht schlucken... SetIntervall läuft frisch fröhlich weiter...

Habt ihr einen Tipp für mich.
Verzweifle jetzt dann bald...

Vielen Dank für die Untersützung.
 
Vielen Dank für des Feedback.

Das ich hier schreibe bedeutet, dass ich vorher die Doku angesehen habe... auch auf google gesucht habe und verschiedene Lösungen ausprobiert habe. Das Forum ist für mich immer die letzte Alternative. ich versuche es immer vorher alleine bevor ich nach Hilfe frage...
Der Browser stürtz jedoch regelmässig ab.. Ich hatte in einem anderen Tab das Fenster offen, während ich diesen Beitrag schrieb... durfte ich zweimal schreiben... Browserabsturz...

Hier der Link: Manuelle TEST Zahlung
Hier bitte auf bezahlen klicken, damit das JS gestartet wird...

Vielen Dank für die Unterstützung.
 
Hmm, mein Browser ist jetzt nicht abgestürzt (FF 27.0.1), auch die Auslastung meines Rechners ist jetzt nicht in die Höhe gegangen.

Hast du den Code mal auf einem anderen Rechner probiert?
 
In dem ersten Link oben ist ein wunderbares Beispiel, wie man die beiden Funktionen benutzt... window.clearInterval() erwartet als Parameter einfach keine Funktionsreferenz - und wenn das so wäre, müsstest du exakt die gleiche Funkionsreferenz bereitstellen, die du auch bei window.setInterval() benutzt hast, und keine neue anonyme Funktion.

... aber deine Logik ist auch komplett falsch und mich wunders es nicht, dass dein Browser abstürzt: bei jedem AJAX erzeugst du ein neues Interval. Somit hast du nach dem ersten Aufruf ein Interval, dann nach vier Sekunden erzeugst du einen Neuen (jetzt hast du zwei), dann nach weiteren vier Sekunden wieder zwei Neue (jetzt hast du vier), usw. Das ist ein exponentioneller Anwachs von Intervallen und AJAX-Aufrufen. Kein Wunder, dass der Rechner da nach ein paar Minuten streikt.

Entweder du steigst von Interval auf window.setTimeout() um, damit hast du keine Akkumulation, da Timeouts nur ein einziges mal feuern, oder du machst wirklich nur ein einziges Interval, das du im window.onload startest.

PS: JS-Code im Rückgabewert eines XHR ist extrem unhandlich und extrem schwer zu debuggen.

EDIT: @rico & @julian: lasst das mal eine Zeitlang laufen...
 
Zuletzt bearbeitet:
Vielen herzlichen Dank für das Feedback.

Das hilft mir schon sehr viel weiter. Jetzt weiss ich wieso, der Browser streikt... werde die settimtout-Variante ansehen... jetzt ist mir einiges klar...
Ich werde es versuchen und dann das Ergebnis hier posten...

Vielen Dank für die Hilfe!
 
Bitte - gern geschehen.

Schau' dir das mit dem clearTimeout() aber trotzdem nochmal genau an, wie das funktioniert.

@rico & @julian: nach fünf Minuten ist ein komplett neu gestarteter Chrome bei mir bei 500MB RAM und durchschnittlich 25% CPU-Auslastung (also einem kompletten Kern).
 
Hallo kkapsner

Ich glaube jetzt ist es Zeit für eine Entschuldigung...
Das Beispiel in Deinem ersten Post war eigentlcih genau die Lösung. Sorry, dass ich dem nicht näher eingegangen bin.

Mein Script liefert über JSON vier verschiedene Status.
Je nach status wollte ich den clearIntervall aufrufen.

Hat jetzt geklappt. Stichwort war "anonyme Funktion"... Deswegen der expotenzeller Anwachs.. wie Du bereits erwähnt hast.

Lösung:

HTML:
<script>
var nIntervId;
 
function loadcontent() {
  nIntervId = setInterval(empfangaufruf(), 500);
}
 

 
function stoploadcontent() {
  clearInterval(nIntervId);
}


</script>

Und dann je nach Status wenn ein reload erlaubt ist:

HTML:
<script type="text/javascript">
	$( document ).ready( loadcontent() )
</script>


Und wenn der reload aufhören muss:

HTML:
<script type="text/javascript">
	$( document ).ready( stoploadcontent() )
</script>


So funktioniert es stabil...
Vielen Dank nochmals!
 
Hallo kkapsner

Ich glaube jetzt ist es Zeit für eine Entschuldigung...
Das Beispiel in Deinem ersten Post war eigentlcih genau die Lösung. Sorry, dass ich dem nicht näher eingegangen bin.
Kein Problem.

HTML:
<script>
var nIntervId;
 
function loadcontent() {
  nIntervId = setInterval(empfangaufruf(), 500);
}
 

 
function stoploadcontent() {
  clearInterval(nIntervId);
}


</script>
Hier hat sich ein kleiner, aber entscheidender Fehler eingeschlichen:
Code:
function loadcontent() {
  nIntervId = window.setInterval(empfangaufruf, 500);
}
 
Zurück
Oben