Tutorial: _runDemo komplett ueberarbeitet mit dreifacher Absicherung

_runDemo hat jetzt drei Sicherheitsnetze:
1. .then() - Wenn Demo-Promise resolved aber _demoRunning noch true:
   Navigation wird trotzdem freigegeben
2. .catch() - Bei Fehler: Navigation wird sofort freigegeben
3. Fallback-Timeout (30s) - Falls Demo komplett haengt: Automatische
   Freigabe nach 30 Sekunden

done()-Funktion ist idempotent (kann mehrfach aufgerufen werden).
Handles auch den Fall dass fn.call() kein Promise zurueckgibt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
Claude Dev
2026-03-16 17:31:35 +01:00
Ursprung 0c9ee1c144
Commit 2e1dc9a60e
2 geänderte Dateien mit 29 neuen und 4 gelöschten Zeilen

Datei anzeigen

@@ -496,12 +496,37 @@ const Tutorial = {
// Sichere Demo-Ausfuehrung: Faengt Fehler ab und stellt Navigation sicher
_runDemo(fn) {
var self = this;
fn.call(this).catch(function(e) {
var finished = false;
function done() {
if (finished) return;
finished = true;
self._hideCursor();
self._clearSubHighlights();
self._demoRunning = false;
self._enableNavAfterDemo();
});
}
// Fallback-Timeout: Nach 30s wird Demo auf jeden Fall beendet
var fallback = setTimeout(done, 30000);
try {
var result = fn.call(this);
if (result && typeof result.then === 'function') {
result.then(function() {
clearTimeout(fallback);
// Demo-Methode hat _enableNavAfterDemo selbst aufgerufen,
// aber falls nicht, machen wir es hier
if (self._demoRunning) done();
}).catch(function(e) {
clearTimeout(fallback);
done();
});
} else {
// Synchron beendet
clearTimeout(fallback);
if (self._demoRunning) done();
}
} catch(e) {
clearTimeout(fallback);
done();
}
},
// -----------------------------------------------------------------------