JavaScript interval mehrmals aufrufen?
Hallo, ich habe das Problem, dass ich ein Interval mehrmals aufrufen möchte.
Jedoch kann ich immer nur eines abbrechen.
Ich hätte das Abbrechen so versucht:
clearInterval(interval + thema);
Funktioniert leider nicht.
var zahl = 0;
var intervalphp = setInterval(erhoeheZahl, 100, 90, 'php');
var intervalcss = setInterval(erhoeheZahl, 100, 100, 'css');
function erhoeheZahl(max, kreis, thema) {
zahl++;
console.log(zahl);
document.getElementById(kreis).innerHTML = zahl;
document.getElementById(kreis + 'kreis').style.background = `conic-gradient(#712e1e ${zahl * 3.6}deg, #ffd5af 0deg)`;
if (zahl >= max) {
clearInterval(interval + thema);
}
}
Danke im voraus!
2 Antworten
Du musst natürlich das passende Interval übergeben.
Was du hier versuchst ist etwas, was man eher mit einem Array oder dergleichen lösen würde.
var interval = array();
interval['php'] = setInterval(erhoeheZahl, 100, 90, 'php');
interval['css']= setInterval(erhoeheZahl, 100, 100, 'css');
function erhoeheZahl(max, kreis, thema) {
zahl++;
console.log(zahl);
document.getElementById(kreis).innerHTML = zahl;
document.getElementById(kreis + 'kreis').style.background = `conic-gradient(#712e1e ${zahl * 3.6}deg, #ffd5af 0deg)`;
if (zahl >= max) {
clearInterval(interval[thema]);
}
}
Oder so ähnlich.
So ähnlich. Musst du halt anpassen, ist nur auf die schnelle getippt.
Ich habe die erste Zeile jetzt so abgeändert:
var interval = [];
Der Effekt funktioniert, aber er hört nicht auf an der richtigen Stelle.
Kann sein, dass sich das Aufheben des Intervals leicht verzögert. Oder was genau meinst du?
Ich habe jedoch jetzt das Problem, dass es nicht mehr stoppt
Wie rufst du denn "erhöheZahl" auf?
Mach dir da mal eine Ausgabe und schau, ob die If-Bedingung erreicht und ob sie erfüllt wird.
Es stoppt nur, wenn ich die Bedingung auf ein Gleichzeichen ändere, jedoch habe ich den Effekt nicht mehr
Du meinst ein '=' oder ein '=='? Bei einem '==' solltest du eigentlich nicht das Problem haben, dass es nicht stoppt, denn wenne s bei einem '==' stoppt, dann stoppt es auch bei einem '>='.
Ansonsten wie gesagt, bau dir eine Ausgabe ein und schau in der Konsole was passiert. Ich kenne dein Programm nicht, daher kann ich dir nur bedingt helfen.
JS:
var zahl = 0;
var interval = [];
interval['php'] = setInterval(erhoeheZahl, 100, 90, 'php');
interval['css'] = setInterval(erhoeheZahl, 100, 100, 'css');
function erhoeheZahl(max, kreis, thema) {
zahl++;
console.log(zahl);
document.getElementById(kreis).innerHTML = zahl;
document.getElementById(kreis + 'kreis').style.background = `conic-gradient(#712e1e ${zahl * 3.6}deg, #ffd5af 0deg)`;
if (zahl == max) {
clearInterval(interval[thema]);
}
}
HTML:
<div class="skills">
<div class="kreis" id="phpkreis">
<div class="text">
<h2 id="php">0</h2>
<p>PHP</p>
</div>
</div>
</div>
<div class="skills">
<div class="kreis" id="csskreis">
<div class="text">
<h2 id="css">0</h2>
<p>CSS</p>
</div>
</div>
Achso, das "erhoeheZahl" ist ja die Intervalfunktion.
Also mit '==' sollte es nicht gehen (da dürfte nur ein Interval stoppen), mit '>=' müsste es aber gehen.
Dein fehler hier ist allerdings, dass du vergessen hast, ein Argument anzugeben (entweder fehlt die Intervalzeit oder einer der Zahlenwerte):
https://developer.mozilla.org/en-US/docs/Web/API/setInterval
Ich habe es abgeändert und es läuft trotzdem weiter:
if (zahl >= max) {
clearInterval(interval[thema]);
}
Ich weiß leider nicht, was du mit " Intervalzeit oder einer der Zahlenwerte" meinst?
Die Funtion "setInterval" nimmt als Parameter das Callback, die Intervallzeit und dann erst die Funktionsparameter.
Deine Funktion nimmt drei Parameter, folglich solltest du 2+3 = 5 Parameter bei "setInterval" übergeben, du übergibst aber nur 4.
Danke, für deine Zeit es funktioniert jetzt wunderbar!
Hallo, ich muss leider noch einmal nachfragen, weil sie das Stoppen verzögert. Wenn ich ZB den Wert 90 übergebe bleibt er bei 95 stehen.
Das ist die Race-Condition, die ich vorher nicht erwähnte, aber erwähnen wollte.
Du hast zwei Interval-Timer und deren Aufrufe können sich überlappen (werden aber iirc je nach Methode sequelzialisiert).
Allerdings solltest du dadurch dennoch nicht auf 95 kommen, sondern nur maximal auf 91 oder so.
Müsstest du genauer untersuchen, weiß ich jetzt auch nicht sicher, woran es liegt. Versuch es mal nur mit einem Interval.
versuchs nicht mit intervall sondern mit timeout
Wie kann ich das lösen?