J'ai remarqué lors de l'extension de la variable globale avec jsdom().parentWindow
, et également en incluant une grande bibliothèque telle que bluebird
ou engine.io
, des erreurs JSDOM avec une taille maximale de pile d'appels dépassée.
JSDOM continue de fonctionner s'il est enveloppé dans une instruction try...catch
, serait-il donc possible de gérer correctement cette erreur dans JSDOM ?
_(global).extend(jsdom().parentWindow)
var engine = require('engine.io')
Résulte en:
node_modules/jsdom/lib/jsdom/browser/index.js:121
this.setTimeout = function (fn, ms) { return startTimer(setTimeout, clearT
^
RangeError: Maximum call stack size exceeded
Je comprends que le cas d'utilisation est assez bizarre, mais je suis curieux de savoir ce que signifie réellement cette erreur.
C'est un problème car le window.setTimeout
jsdom contient un appel à global.setTimeout
. Quand ils sont identiques, il y a un débordement de pile.
Puisque NodeJS a setTimeout, y a-t-il une raison pour laquelle window.setTimeout ne peut pas simplement être un clone de la fonction native ?
Cela fait un moment que je n'ai pas travaillé sur JSDOM, mais l'implémentation du temporisateur JSDOM IIRC garde une trace des temporisateurs ouverts afin que nous puissions les annuler dans window.close
pour éviter les fuites de mémoire des temporisateurs suspendus.
@brianmcd ahhhh je vois pourquoi ça fait ça maintenant.
Si des fous ont ce problème à l'avenir, utilisez _.defaults
au lieu de _.extend
pour éviter ce problème.
Tellement heureux que vous ayez publié votre dernier commentaire sur l'utilisation de defaults
au lieu de extend
. Merci @JacksonGariety !
Commentaire le plus utile
@brianmcd ahhhh je vois pourquoi ça fait ça maintenant.
Si des fous ont ce problème à l'avenir, utilisez
_.defaults
au lieu de_.extend
pour éviter ce problème.