Jsdom: parentWindowを使用してグローバルに拡張すると、最大呼び出しスタックサイズを超えました

作成日 2014年01月23日  ·  4コメント  ·  ソース: jsdom/jsdom

グローバル変数をjsdom().parentWindowで拡張し、 bluebirdengine.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

ユースケースが非常に奇妙であることは理解していますが、このエラーが実際に何を意味するのか興味があります。

最も参考になるコメント

@brianmcd ahhhhなぜ今、これを行っているのか

将来、クレイジーな人がこの問題を抱えている場合は、この問題を回避するために、 _.extend代わりに_.defaults使用してください。

全てのコメント4件

jsdomのwindow.setTimeoutglobal.setTimeoutへの呼び出しが含まれているため、これは問題です。 それらが同じである場合、スタックオーバーフローが発生します。

NodeJSにはsetTimeoutがあるので、window.setTimeoutがネイティブ関数のクローンになれない理由はありますか?

JSDOMに取り組んでからしばらく経ちますが、IIRC JSDOMタイマーの実装は開いているタイマーを追跡するため、 window.closeキャンセルして、タイマーのぶら下がりによるメモリリークを回避できます。

@brianmcd ahhhhなぜ今、これを行っているのか

将来、クレイジーな人がこの問題を抱えている場合は、この問題を回避するために、 _.extend代わりに_.defaults使用してください。

defaults代わりにextend defaultsを使用することについての最後のコメントを投稿していただきありがとうございます。 ありがとう@JacksonGariety!

このページは役に立ちましたか?
0 / 5 - 0 評価