2016-06-05 3 views
0

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?

+0

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

+0

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. –

Antwort

2

Ich lasse dies für den Fall, dass jemand in etwas Ähnliches läuft, aber das Problem wurde durch die point.x und point.y Werte als Strings anstelle von Zahlen, und das verursachte unerwartetes Verhalten verursacht.

So stellte sich heraus, dass ich nach wie vor dumm war, obwohl es immer noch ein Rätsel ist, warum es nur Fehler verursachte, wenn es innerhalb von Timeout-Funktionen lief.

Verwandte Themen