Ein seltsames Problem beim Erzeugen von Quadtrees innerhalb von d3.timer
. Mit dem folgenden Code ein Quadtree zum Erzeugen wirft keine Fehler:Das Erzeugen von Quadtree innerhalb von d3.timer verursacht einen Stack-Überlauf
var tree = d3.geom.quadtree(data);
Aber ich bin mit dem Baum zur Kollisionserkennung ähnlich wie this example. Der große Unterschied ist, dass ich keine Kraft Layout verwenden, so dass anstelle der Erzeugung des Baumes innerhalb force.on('tick')
, ich versuche es mit dem Timer zu tun:
d3.timer(function() {
var tree = d3.geom.quadtree(data);
});
Dies wirft einen Stapelüberlauf-Fehler:
Uncaught RangeError: Maximum call stack size exceeded
Ich kann nicht verstehen, warum das passiert, aber es scheint etwas mit JS Timing-Mechanismus zu tun haben. Die Erzeugung des Quadtrees innerhalb einer setTimeout
oder setInterval
verursacht den gleichen Fehler, selbst bei sehr langsamen Intervallen. Das Generieren von Tausenden innerhalb einer Schleife funktioniert gut.
Jeder hat einen Einblick in was ist los? Mache ich etwas Dummes, oder sollte ich ein Problem bei d3's GitHub einreichen?
Sie planen einen neuen Timer und rufen die angegebene Funktion wiederholt auf, bis der Timer gestoppt wird. Sie erstellen alle neuen Bauminstanzen, immer und immer wieder. Irgendwann wirst du keinen Speicher mehr haben – Klaujesi
Denke nicht, dass es das ist. Der Quadtree wird jedes Mal überschrieben. Außerdem war ich dumm. Mein X und Y wurden als Zeichenfolgen gespeichert, was das unerwartete Verhalten verursachte. Es funktioniert jetzt. –