Percebi que ao estender a variável global com jsdom().parentWindow
, e também incluir uma biblioteca grande como bluebird
ou engine.io
, erros JSDOM com um tamanho máximo de pilha de chamadas excedido.
O JSDOM continua a funcionar se estiver envolvido em uma instrução try...catch
, então seria possível lidar com esse erro dentro do JSDOM?
_(global).extend(jsdom().parentWindow)
var engine = require('engine.io')
Resulta em:
node_modules/jsdom/lib/jsdom/browser/index.js:121
this.setTimeout = function (fn, ms) { return startTimer(setTimeout, clearT
^
RangeError: Maximum call stack size exceeded
Eu entendo que o caso de uso é bastante bizarro, mas estou curioso para saber o que esse erro realmente significa.
Isso é um problema porque o window.setTimeout
do jsdom contém uma chamada para global.setTimeout
. Quando eles são iguais, há um estouro de pilha.
Como o NodeJS tem setTimeout, existe algum motivo pelo qual window.setTimeout não pode ser apenas um clone da função nativa?
Já faz um tempo desde que eu trabalhei em JSDOM, mas IIRC a implementação do temporizador JSDOM mantém o controle dos temporizadores abertos para que possamos cancelá-los em window.close
para evitar vazamentos de memória de temporizadores pendentes.
@brianmcd ahhhh eu vejo porque está fazendo isso agora.
Se algum maluco tiver esse problema no futuro, use _.defaults
vez de _.extend
para evitar esse problema.
Que bom que você postou seu último comentário sobre o uso de defaults
vez de extend
. Obrigado @JacksonGariety!
Comentários muito úteis
@brianmcd ahhhh eu vejo porque está fazendo isso agora.
Se algum maluco tiver esse problema no futuro, use
_.defaults
vez de_.extend
para evitar esse problema.