لقد لاحظت عند توسيع المتغير العام بـ 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 ، لكن تنفيذ مؤقت JSDOM IIRC يتتبع أجهزة ضبط الوقت المفتوحة حتى نتمكن من إلغائها في window.close
لتجنب تسرب الذاكرة من أجهزة ضبط الوقت المتدلية.
brianmcd ahhhh أرى لماذا يفعل هذا الآن.
إذا واجه أي شخص مجنون هذه المشكلة في المستقبل ، فاستخدم _.defaults
بدلاً من _.extend
لتجنب هذه المشكلة.
سعيد جدًا لأنك نشرت تعليقك الأخير حول استخدام defaults
بدلاً من extend
. JacksonGariety!
التعليق الأكثر فائدة
brianmcd ahhhh أرى لماذا يفعل هذا الآن.
إذا واجه أي شخص مجنون هذه المشكلة في المستقبل ، فاستخدم
_.defaults
بدلاً من_.extend
لتجنب هذه المشكلة.