2016-04-04 2 views
0

Ich habe Verhalten von einer Web-Anwendung, die ich nicht klären kann: das Hinzufügen von Warnmeldungen zum Debuggen "löst" das Problem, da der Fehler nicht auftritt. Die relevanten Teile der Geschichte sind wie folgt:Wie kann das Debugging mit Alarm (nicht definiertes) Timing-Problem lösen?

Ich habe eine init-Methode, eine Funktion, die Inhalt und eine "Haupt" -Funktion, etwas wie (beachte, dass a ist eine globale Variable, Teil eines Namespace) PS: Es stellt sich heraus, dass in meinem minimalen Beispieläquivalent ein wesentlicher Teil fehlte, der das Problem verursacht hat.

Bei Ausführung wie oben: Alarm 1 wird angezeigt, dann Alarm 2, dann Inhalt eines Get angezeigt. Wenn ohne die Benachrichtigung ausgeführt wird der folgende Fehler ausgelöst wird, brechen die App:

TypeError: a is undefined 

Alle Funktionen nach dem Dokument bereit Ereignis aufgerufen werden, wird gefeuert, soweit ich das beurteilen kann, und die Alarmlinien wurden hinzugefügt, um zu prüfen, richtige Reihenfolge der Ausführung.

Frage ist dann, wie das Hinzufügen der Alarmzeilen das Initialisierungsproblem lösen kann? dann: wie kann man es ohne sie lösen?

+0

'neues A' wird ein' A' mit seinem _prototype_ initialisieren, aber 'show' ist im Konstruktor definiert und daher nicht vererbt. Ist es behoben, wenn Sie 'A.prototype.show = function() {...}' verwenden? Und Warnungen sollten und _will_ keinen Unterschied bei der Codeausführung machen, also schauen Sie in andere Richtungen nach Fehlern. – somethinghere

+1

Während es wichtig ist, ein reduziertes Beispiel zu erstellen, ist Ihr Code ungültig und nicht sinnvoll. Offensichtlich läuft das nicht, weil du sagst, es funktioniert mit dem 'alert()'. Veröffentlichen Sie eine tatsächliche Darstellung des Problems. –

+1

Wenn eine Warnung Ihren Code verändert, kann ich nur daran denken, wenn Sie etwas asynchrones tun, wie das Laden einer lokalen Datei oder das Mischen von Bibliotheken wie eckig und jquery, so dass Sie Timing-Unterschiede erhalten. Mir ist das gleiche passiert wie mir, aber normalerweise stellt sich heraus, dass es sich bei der Warnmeldung um einen Ablenkungsmanöver handelt, und das Problem liegt in der Reihenfolge der Ereignisse. – Toby

Antwort

0

Basierend auf dem, was ich bisher gesammelt habe und dank @Damon, @Fat_Freddy und @squint (Überprüfung des Code-Pfades auf Vollständigkeit des minimalen Beispiels half tatsächlich viel herauszufinden, ein Teil der Lösung), folgt hier ein zusammenfassende Antwort.

Die Verwendung von Alert für Debug-Code fügt eine große Verzögerung im Haupt-Thread hinzu, während auf Benutzereingaben gewartet wird. Dies kann der Hintergrundarbeit in der Ereigniswarteschlange Zeit einräumen, um den Status des Fensters zu ändern (was in meinem Fall eine korrekte Initialisierung ermöglichte). Wenn also das Hinzufügen von Alarmen das Verhalten Ihrer Webanwendung ändert, müssen Sie im Allgemeinen nach Komponenten suchen, die von Hintergrundereignissen beeinflusst werden können.

Wenn keine asynchronen Aufrufe (AJAX) oder Ereignisse in der Warteschlange vorhanden sind, die den App-Status beeinflussen können, können Warnungen das Verhalten einer Webanwendung nicht ändern.