グローバル変数をjsdom().parentWindow
で拡張し、 bluebird
やengine.io
などの大きなライブラリを含めると、最大呼び出しスタックサイズを超えるJSDOMエラーが発生することに気付きました。
JSDOMは、 try...catch
ステートメントでラップされた場合でも機能し続けるので、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なぜ今、これを行っているのか
将来、クレイジーな人がこの問題を抱えている場合は、この問題を回避するために、 _.extend
代わりに_.defaults
使用してください。
defaults
代わりにextend
defaults
を使用することについての最後のコメントを投稿していただきありがとうございます。 ありがとう@JacksonGariety!
最も参考になるコメント
@brianmcd ahhhhなぜ今、これを行っているのか
将来、クレイジーな人がこの問題を抱えている場合は、この問題を回避するために、
_.extend
代わりに_.defaults
使用してください。