JavaScript interval mehrmals aufrufen?

2 Antworten

Vom Beitragsersteller 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.


verreisterNutzer  20.02.2023, 14:50

Wie kann ich das lösen?

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

verreisterNutzer  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.

Destranix  20.02.2023, 16:45
@verreisterNutzer

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

Destranix  20.02.2023, 16:48
@verreisterNutzer

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.

verreisterNutzer  20.02.2023, 16:50
@Destranix

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

Destranix  20.02.2023, 16:53
@verreisterNutzer

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.

verreisterNutzer  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>
verreisterNutzer  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?

Destranix  20.02.2023, 17:09
@verreisterNutzer

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.

verreisterNutzer  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.

Destranix  20.02.2023, 17:54
@verreisterNutzer

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