Saya menggunakan file perpustakaan JavaScript Direct Web Remoting (DWR) dan saya mendapatkan kesalahan hanya di Safari (desktop dan iPad)
Ia mengatakan
Ukuran tumpukan panggilan maksimum terlampaui.
Apa sebenarnya arti kesalahan ini dan apakah itu berhenti memproses sepenuhnya?
Juga setiap perbaikan untuk Safari
browser (Sebenarnya pada iPad Safari
, katanya
JS: eksekusi melebihi batas waktu
yang saya asumsikan adalah masalah tumpukan panggilan yang sama)
data
di ajax. Memperbaiki kesalahan dengan mendeklarasikan variabel.Jawaban:
Ini berarti bahwa di suatu tempat dalam kode Anda, Anda memanggil fungsi yang pada gilirannya memanggil fungsi lain dan seterusnya, sampai Anda mencapai batas tumpukan panggilan.
Ini hampir selalu karena fungsi rekursif dengan kasus dasar yang tidak terpenuhi.
Melihat tumpukan
Pertimbangkan kode ini ...
Berikut adalah tumpukan setelah beberapa panggilan ...
Seperti yang Anda lihat, tumpukan panggilan tumbuh hingga mencapai batas: ukuran hardcod browser atau kehabisan memori.
Untuk memperbaikinya, pastikan bahwa fungsi rekursif Anda memiliki kasus dasar yang dapat dipenuhi ...
sumber
Anda kadang-kadang bisa mendapatkan ini jika Anda secara tidak sengaja mengimpor / menyematkan file JavaScript yang sama dua kali, layak diperiksa di tab sumber daya inspektur Anda.
sumber
Dalam kasus saya, saya mengirim elemen input alih-alih nilainya:
Dari pada:
Ini membekukan tab Chrome saya ke titik yang bahkan tidak menunjukkan dialog 'Tunggu / Bunuh' ketika halaman menjadi tidak responsif ...
sumber
Ada loop rekursif di suatu tempat dalam kode Anda (yaitu fungsi yang akhirnya memanggil dirinya sendiri berulang-ulang sampai stack penuh).
Peramban lain memiliki tumpukan yang lebih besar (sehingga Anda mendapatkan batas waktu sebagai gantinya) atau mereka menelan kesalahan karena beberapa alasan (mungkin coba-tangkap yang ditempatkan dengan buruk).
Gunakan debugger untuk memeriksa tumpukan panggilan saat kesalahan terjadi.
sumber
Masalah dengan mendeteksi stackoverflows adalah kadang-kadang jejak stack akan hilang dan Anda tidak akan dapat melihat apa yang sebenarnya terjadi.
Saya telah menemukan beberapa alat debugging baru Chrome yang berguna untuk ini.
Tekan
Performance tab
, pastikanJavascript samples
diaktifkan dan Anda akan mendapatkan sesuatu seperti ini.Cukup jelas di mana limpahannya ada di sini! Jika Anda mengklik
extendObject
Anda akan benar-benar dapat melihat nomor baris yang tepat dalam kode.Anda juga dapat melihat timing yang mungkin atau mungkin tidak membantu atau herring merah.
Trik lain yang bermanfaat jika Anda tidak dapat menemukan masalahnya adalah dengan meletakkan banyak
console.log
pernyataan di tempat yang menurut Anda masalahnya. Langkah sebelumnya di atas dapat membantu Anda dengan ini.Di Chrome jika Anda berulang kali mengeluarkan data identik, itu akan menampilkannya seperti ini yang menunjukkan di mana masalahnya lebih jelas. Dalam hal ini tumpukan mencapai 7152 frame sebelum akhirnya macet:
sumber
Dalam kasus saya, saya mengubah array byte besar menjadi string menggunakan yang berikut ini:
bytes
berisi beberapa juta entri, yang terlalu besar untuk muat di tumpukan.sumber
var uintArray = new Uint16Array(bytes); var converted = []; uintArray.forEach(function(byte) {converted.push(String.fromCharCode(byte))});
Dalam kasus saya, acara klik disebarkan pada elemen anak. Jadi, saya harus meletakkan yang berikut ini:
pada acara klik:
Berikut adalah kode html:
sumber
Periksa detail kesalahan di konsol bilah alat dev Chrome, ini akan memberi Anda fungsi di tumpukan panggilan, dan memandu Anda menuju rekursi yang menyebabkan kesalahan.
sumber
Jika Anda membutuhkan proses / rekursi tak terbatas yang berjalan karena alasan tertentu, Anda dapat menggunakan webworker di utas terpisah. http://www.html5rocks.com/en/tutorials/workers/basics/
jika Anda ingin memanipulasi elemen dom dan menggambar ulang, gunakan animasi http://creativejs.com/resources/requestanimationframe/
sumber
Hampir setiap jawaban di sini menyatakan bahwa ini hanya dapat disebabkan oleh loop tak terbatas. Itu tidak benar, jika tidak Anda bisa menjalankan stack melalui panggilan yang sangat bersarang (bukan untuk mengatakan itu efisien, tapi itu tentu saja mungkin). Jika Anda memiliki kendali atas JavaScript VM Anda, Anda dapat menyesuaikan ukuran tumpukan. Sebagai contoh:
node --stack-size=2000
Lihat juga: Bagaimana saya dapat meningkatkan ukuran tumpukan panggilan maksimum di Node.js
sumber
Dalam kasus saya, dua modals jQuery menunjukkan ditumpuk di atas satu sama lain. Mencegah itu menyelesaikan masalah saya.
sumber
Kami baru-baru ini menambahkan bidang ke situs admin yang sedang kami kerjakan - contact_type ... mudah bukan? Nah, jika Anda memanggil pilih "ketik" dan mencoba mengirimkannya melalui jquery ajax call gagal dengan kesalahan ini terkubur dalam-dalam di jquery.js Jangan lakukan ini:
Masalahnya adalah type: type - saya percaya itu adalah kita menamai argumen "type" - memiliki nilai variabel bernama type bukan masalah. Kami mengubah ini menjadi:
Dan menulis ulang some_function.php sesuai - masalah terpecahkan.
sumber
Periksa apakah Anda memiliki fungsi yang memanggil dirinya sendiri. Sebagai contoh
sumber
Ini juga dapat menyebabkan
Maximum call stack size exceeded
kesalahan:Sama disini:
Dari Mozilla Docs :
Jadi cobalah:
sumber
Kedua doa dari kode yang identik di bawah ini jika dikurangi 1 bekerja di Chrome 32 di komputer saya misalnya 17905 vs 17904. Jika dijalankan seperti itu mereka akan menghasilkan kesalahan "RangeError: Ukuran tumpukan panggilan maksimum terlampaui". Tampaknya batas ini bukan hardcode tetapi tergantung pada perangkat keras mesin Anda. Tampaknya jika dipanggil sebagai fungsi, batas yang dikenakan sendiri ini lebih tinggi daripada jika dipanggil sebagai metode yaitu kode khusus ini menggunakan lebih sedikit memori ketika dipanggil sebagai fungsi.
Dipanggil sebagai metode:
Dipanggil sebagai fungsi:
sumber
Anda dapat menemukan fungsi rekursif Anda di browser crome, tekan ctrl + shift + j dan kemudian tab sumber, yang memberi Anda aliran kompilasi kode dan Anda dapat menemukan menggunakan break point dalam kode.
sumber
Saya juga menghadapi masalah serupa di sini adalah detail saat mengunggah logo menggunakan kotak unggah logo dropdown
CSS.css
sebelum koreksi kode saya adalah:
Kesalahan di konsol:
Saya menyelesaikannya dengan menghapus
onclick="$('#filePhoto').click()"
dari tag div.sumber
Saya menghadapi masalah yang sama saya telah mengatasinya dengan menghapus nama bidang yang digunakan dua kali pada ajax misalnya
sumber
Saya tahu utas ini sudah lama, tetapi saya pikir ada baiknya menyebutkan skenario saya menemukan masalah ini sehingga dapat membantu orang lain.
Misalkan Anda memiliki elemen bersarang seperti ini:
Anda tidak dapat memanipulasi peristiwa elemen anak di dalam acara induknya karena itu merambat ke dirinya sendiri, membuat panggilan rekursif sampai pengecualian dilemparkan.
Jadi kode ini akan gagal:
Anda memiliki dua opsi untuk menghindari ini:
sumber
Saya memiliki kesalahan ini karena saya memiliki dua Fungsi JS dengan nama yang sama
sumber
Jika Anda bekerja dengan google maps, maka periksa apakah lat lng yang diteruskan
new google.maps.LatLng
memiliki format yang tepat. Dalam kasus saya mereka disahkan sebagai tidak terdefinisi.sumber
Masalah dalam kasus saya adalah karena saya memiliki rute anak-anak dengan jalur yang sama dengan orang tua:
Jadi saya harus menghapus jalur rute anak-anak
sumber
dalam kasus saya, saya mendapatkan kesalahan ini pada panggilan ajax dan data yang saya coba berikan variabel itu belum didefinisikan, yang menunjukkan kepada saya kesalahan ini tetapi tidak menggambarkan variabel yang tidak didefinisikan. Saya menambahkan didefinisikan bahwa variabel n mendapat nilai.
sumber
Telah menemukan masalah yang sama, coulnd't tahu apa yang salah mulai menyalahkan Babel;)
Memiliki kode yang tidak mengembalikan pengecualian di browser:
masalah ini dibuat dengan buruk || (atau) bagian ketika babel membuat pemeriksaan tipenya sendiri:
jadi hapus
membuat transpilasi babel bekerja.
sumber
Dalam kasus saya saya karena kesalahan saya telah menetapkan nama variabel yang sama, dan untuk fungsi val "class_routine_id"
itu harus seperti:
sumber
di Angular, jika Anda menggunakan mat-select dan memiliki lebih dari 400 pilihan, kesalahan ini dapat terjadi https://github.com/angular/components/issues/12504
Anda harus memperbarui versi @ angular / material
sumber
Saya menggunakan React-Native 0.61.5 bersama dengan ( npm 6.9.0 & node 10.16.1 )
Sementara saya menginstal perpustakaan baru di Proyek saya mendapat dari
(mis. npm instal @ react-navigation / native --save)
Ukuran tumpukan panggilan maksimum melebihi kesalahan
untuk itu, saya coba
sudo npm cache clean --force
(Catatan: - Perintah di bawah ini biasanya membutuhkan waktu 1 hingga 2 menit tergantung pada ukuran cache npm Anda )
sumber
Terkadang terjadi karena konversi tipe data, misalnya Anda memiliki objek yang Anda anggap sebagai string.
socket.id di nodejs baik di js client sebagai contoh, bukan string. untuk menggunakannya sebagai string, Anda harus menambahkan kata String sebelum:
sumber
Saya mencoba untuk menetapkan variabel, nilai, ketika variabel itu belum dideklarasikan.
Mendeklarasikan variabel memperbaiki kesalahan saya.
sumber