Saya perhatikan ketika memperluas variabel global dengan jsdom().parentWindow
, dan juga menyertakan perpustakaan besar seperti bluebird
atau engine.io
, kesalahan JSDOM dengan ukuran tumpukan panggilan maksimum terlampaui.
JSDOM terus berfungsi jika dibungkus dengan pernyataan try...catch
, jadi apakah mungkin untuk menangani kesalahan ini dengan baik di dalam JSDOM?
_(global).extend(jsdom().parentWindow)
var engine = require('engine.io')
Hasil dalam:
node_modules/jsdom/lib/jsdom/browser/index.js:121
this.setTimeout = function (fn, ms) { return startTimer(setTimeout, clearT
^
RangeError: Maximum call stack size exceeded
Saya mengerti bahwa use case ini cukup aneh, tetapi saya ingin tahu apa arti sebenarnya dari kesalahan ini.
Ini adalah masalah karena window.setTimeout
jsdom berisi panggilan ke global.setTimeout
. Ketika mereka sama, ada stack overflow.
Karena NodeJS memiliki setTimeout, apakah ada alasan window.setTimeout tidak bisa hanya menjadi tiruan dari fungsi asli?
Sudah lama sejak saya bekerja di JSDOM, tetapi IIRC implementasi timer JSDOM melacak timer terbuka sehingga kami dapat membatalkannya di window.close
untuk menghindari kebocoran memori dari timer yang menggantung.
@brianmcd ahhhh saya mengerti mengapa melakukan ini sekarang.
Jika ada orang gila yang mengalami masalah ini di masa mendatang, gunakan _.defaults
alih-alih _.extend
untuk menghindari masalah ini.
Sangat senang Anda memposting komentar terakhir Anda tentang menggunakan defaults
alih-alih extend
. Terima kasih @JacksonGariety!
Komentar yang paling membantu
@brianmcd ahhhh saya mengerti mengapa melakukan ini sekarang.
Jika ada orang gila yang mengalami masalah ini di masa mendatang, gunakan
_.defaults
alih-alih_.extend
untuk menghindari masalah ini.