JavaScript interval mehrmals aufrufen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

crRaphi 
Fragesteller
 20.02.2023, 14:50

Wie kann ich das lösen?

0
Destranix  20.02.2023, 14:59
@crRaphi
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.

1
crRaphi 
Fragesteller
 20.02.2023, 15:03
@Destranix

Danke, das Funktioniert aber leider nicht

0
Destranix  20.02.2023, 15:14
@crRaphi

So ähnlich. Musst du halt anpassen, ist nur auf die schnelle getippt.

0
crRaphi 
Fragesteller
 20.02.2023, 16:37
@Destranix

Ich habe die erste Zeile jetzt so abgeändert:

var interval = [];

Der Effekt funktioniert, aber er hört nicht auf an der richtigen Stelle.

1
Destranix  20.02.2023, 16:45
@crRaphi

Kann sein, dass sich das Aufheben des Intervals leicht verzögert. Oder was genau meinst du?

0
crRaphi 
Fragesteller
 20.02.2023, 16:46
@Destranix

Ich habe jedoch jetzt das Problem, dass es nicht mehr stoppt

0
Destranix  20.02.2023, 16:48
@crRaphi

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.

0
crRaphi 
Fragesteller
 20.02.2023, 16:50
@Destranix

Es stoppt nur, wenn ich die Bedingung auf ein Gleichzeichen ändere, jedoch habe ich den Effekt nicht mehr

0
Destranix  20.02.2023, 16:53
@crRaphi

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.

0
crRaphi 
Fragesteller
 20.02.2023, 16:55
@Destranix

         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>
1
Destranix  20.02.2023, 17:00
@crRaphi

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

0
crRaphi 
Fragesteller
 20.02.2023, 17:08
@Destranix

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?

0
Destranix  20.02.2023, 17:09
@crRaphi

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.

0
crRaphi 
Fragesteller
 20.02.2023, 17:15
@Destranix

Danke, für deine Zeit es funktioniert jetzt wunderbar!

1
crRaphi 
Fragesteller
 20.02.2023, 17:50
@Destranix

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.

0
Destranix  20.02.2023, 17:54
@crRaphi

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.

0

versuchs nicht mit intervall sondern mit timeout