Ich habe festgestellt, dass beim Erweitern der globalen Variablen mit jsdom().parentWindow
und auch beim Einbinden einer großen Bibliothek wie bluebird
oder engine.io
JSDOM-Fehler mit einer maximalen Aufrufstapelgröße überschritten wurden.
JSDOM funktioniert weiterhin, wenn es in eine try...catch
Anweisung eingeschlossen ist. Wäre es also möglich, diesen Fehler innerhalb von JSDOM ordnungsgemäß zu behandeln?
_(global).extend(jsdom().parentWindow)
var engine = require('engine.io')
Ergebnisse in:
node_modules/jsdom/lib/jsdom/browser/index.js:121
this.setTimeout = function (fn, ms) { return startTimer(setTimeout, clearT
^
RangeError: Maximum call stack size exceeded
Ich verstehe, dass der Anwendungsfall ziemlich bizarr ist, aber ich bin neugierig, was dieser Fehler wirklich bedeutet.
Dies ist ein Problem, da window.setTimeout
jsdom einen Aufruf von global.setTimeout
. Wenn sie gleich sind, gibt es einen Stapelüberlauf.
Da NodeJS setTimeout hat, gibt es einen Grund, warum window.setTimeout nicht einfach ein Klon der nativen Funktion sein kann?
Es ist eine Weile her, seit ich an JSDOM gearbeitet habe, aber IIRC, die JSDOM-Timer-Implementierung, verfolgt offene Timer, sodass wir sie in window.close
abbrechen können, um Speicherlecks durch baumelnde Timer zu vermeiden.
@brianmcd ahhhh Ich verstehe, warum es das jetzt tut.
Wenn in Zukunft verrückte Leute dieses Problem haben, verwenden Sie _.defaults
anstelle von _.extend
, um dieses Problem zu vermeiden.
Ich freue mich sehr, dass Sie Ihren letzten Kommentar zur Verwendung von defaults
anstelle von extend
gepostet haben. Danke @JacksonGariety!
Hilfreichster Kommentar
@brianmcd ahhhh Ich verstehe, warum es das jetzt tut.
Wenn in Zukunft verrückte Leute dieses Problem haben, verwenden Sie
_.defaults
anstelle von_.extend
, um dieses Problem zu vermeiden.