我注意到在使用jsdom().parentWindow
扩展全局变量时,还包括一个大型库,例如bluebird
或engine.io
,超过最大调用堆栈大小的 JSDOM 错误。
如果包裹在try...catch
语句中,JSDOM 确实会继续运行,那么是否可以在 JSDOM 中优雅地处理此错误?
_(global).extend(jsdom().parentWindow)
var engine = require('engine.io')
结果是:
node_modules/jsdom/lib/jsdom/browser/index.js:121
this.setTimeout = function (fn, ms) { return startTimer(setTimeout, clearT
^
RangeError: Maximum call stack size exceeded
我知道用例很奇怪,但我很好奇这个错误的真正含义。
这是一个问题,因为 jsdom 的window.setTimeout
包含对global.setTimeout
的调用。 当它们相同时,就会出现堆栈溢出。
既然 NodeJS 有 setTimeout,有什么理由 window.setTimeout 不能只是原生函数的克隆?
自从我从事 JSDOM 工作以来已经有一段时间了,但是 IIRC JSDOM 计时器实现会跟踪打开的计时器,因此我们可以在window.close
取消它们以避免悬挂计时器造成内存泄漏。
@brianmcd ahhhh我明白它为什么现在这样做了。
如果以后有疯狂的人遇到这个问题,请使用_.defaults
而不是_.extend
来避免这个问题。
很高兴您发表了关于使用defaults
而不是extend
最后评论。 谢谢@JacksonGariety!
最有用的评论
@brianmcd ahhhh我明白它为什么现在这样做了。
如果以后有疯狂的人遇到这个问题,请使用
_.defaults
而不是_.extend
来避免这个问题。