Anne+Kaffeekanne: clearTimeout feuert nicht - Leider schon dringend ;(

Hallo,

ok, wollte jemandem mit ein paar Zeilen Code zum Geburtstag gratulieren, daher die Dringlichkeit.

Ein Code Snippet macht Schwierigkeiten:

WAS DAS SNIPPET TUT:

  1. Eine "Ringelrei" genannte Funktion iteriert mittels rekursivem Timeout über ein Array.

  2. Das ganze Treiben soll dann von einem Button gestoppt werden, was nicht funktioniert -

rekursives Timeout läuft einfach weiter:

Zugehöriger Code:

<h1 id="Ausgabe"></h1>
<div id="ziel"></div>
<button id="knopf">STOP</button>
const Inhalte = ["Erste Eingabe.", "Zweite Eingabe.", "Dritte Eingabe."];
const Ausgabe = document.getElementById("Ausgabe"); 
const Ziel = document.getElementById("ziel");
let Zaehler = 0;
let RingelspielVar;

function Ringelrei() {
	Ziel.innerHTML = Inhalte[Zaehler];
	if (Zaehler === 2) {
		Zaehler = 0;
	} else {
		Zaehler++;
	}
	let RingelspielVar = setTimeout(Ringelrei, 500);
}

Ringelrei();

function stopRingelrei() {
	clearTimeout(RingelspielVar);
}

const Knopf = document.getElementById("knopf");
Knopf.addEventListener("click", () => {
	stopRingelrei(); // +++ wird ignoriert :( +++
}); 

Vielen Dank an alle, die hier schnell Abhilfe schaffen können! 😀

  1. ok, wollte jemandem mit ein paar Zeilen Code zum Geburtstag gratulieren, daher die Dringlichkeit.

    Na dann... window.clearInterval / window.setInterval sollten Dir bei Deinem Vorhaben behilflich sein.

  2. Entschuldigung Entschuldigung Entschuldigung, Fehler gefunden!

    Ich Dödel hab RingelspielVar zweimal definiert!

    Danke an alle, die hier schon am Werken waren, ihr seid die Besten! 😀

  3. Hi,

    bin kein Javascript-Profi, aber meine Vermutung wäre:

    durch das let RingelspielVar in der Methode erzeugst Du eine Variable, die nur innerhalb der Methode gilt. Die globale RingelspielVar wird also nie gefüllt, daher klappt das Beenden des Timeouts auch nicht, da dabei ja auf die globale Variable zugegriffen wird.

    Also: in der Methode das let weglassen …

    cu,
    Andreas a/k/a MudGuard

    1. Jo, wie gesagt danke, hab da etwas länger drüber gebrütet, Google zum Schwitzen gebracht - und ungefähr viereindreiviertel Sekunden nachdem ich dann hier den Beitrag erstellt hatte, fiel mir der Fehler selbst auf 😀👍

      LG