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:
@@ -764,7 +764,7 @@
|
|||||||
<script src="/static/js/api_network.js?v=20260316a"></script>
|
<script src="/static/js/api_network.js?v=20260316a"></script>
|
||||||
<script src="/static/js/network-graph.js?v=20260316a"></script>
|
<script src="/static/js/network-graph.js?v=20260316a"></script>
|
||||||
<script src="/static/js/app_network.js?v=20260316a"></script>
|
<script src="/static/js/app_network.js?v=20260316a"></script>
|
||||||
<script src="/static/js/tutorial.js?v=20260316s"></script>
|
<script src="/static/js/tutorial.js?v=20260316t"></script>
|
||||||
<script src="/static/js/chat.js?v=20260316f"></script>
|
<script src="/static/js/chat.js?v=20260316f"></script>
|
||||||
<script>document.addEventListener("DOMContentLoaded",function(){Chat.init();Tutorial.init()});</script>
|
<script>document.addEventListener("DOMContentLoaded",function(){Chat.init();Tutorial.init()});</script>
|
||||||
|
|
||||||
|
|||||||
@@ -496,12 +496,37 @@ const Tutorial = {
|
|||||||
// Sichere Demo-Ausfuehrung: Faengt Fehler ab und stellt Navigation sicher
|
// Sichere Demo-Ausfuehrung: Faengt Fehler ab und stellt Navigation sicher
|
||||||
_runDemo(fn) {
|
_runDemo(fn) {
|
||||||
var self = this;
|
var self = this;
|
||||||
fn.call(this).catch(function(e) {
|
var finished = false;
|
||||||
|
function done() {
|
||||||
|
if (finished) return;
|
||||||
|
finished = true;
|
||||||
self._hideCursor();
|
self._hideCursor();
|
||||||
self._clearSubHighlights();
|
|
||||||
self._demoRunning = false;
|
self._demoRunning = false;
|
||||||
self._enableNavAfterDemo();
|
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();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren