Ошибка превышения максимального размера стека вызовов - PullRequest
442 голосов
/ 23 мая 2011

Я использую файл библиотеки JavaScript Direct Web Remoting (DWR) и получаю сообщение об ошибке только в Safari (для ПК и iPad)

Там написано

Превышен максимальный размер стека вызовов.

Что именно означает эта ошибка и останавливает ли она обработку полностью?

Также любое исправление для браузера Safari (На самом деле на iPad Safari написано

JS: превышен тайм-аут выполнения

Я предполагаю, что это та же проблема стека вызовов)

Ответы [ 27 ]

1 голос
/ 09 апреля 2019

Недавно мы добавили поле на сайт администратора, над которым мы работаем - contact_type ... easy right?Что ж, если вы вызываете select "type" и пытаетесь отправить его через вызов jquery ajax, это завершится неудачно с этой ошибкой, скрытой глубоко в jquery.js. Не делайте этого:

$.ajax({
    dataType: "json",
    type: "POST",
    url: "/some_function.php",
    data: { contact_uid:contact_uid, type:type }
});

Проблема в том, чтоtype: type - я считаю, что мы называем аргумент "type" - наличие значения переменной с именем type не является проблемой.Мы изменили это на:

$.ajax({
    dataType: "json",
    type: "POST",
    url: "/some_function.php",
    data: { contact_uid:contact_uid, contact_type:type }
});

И переписали some_function.php соответственно - проблема решена.

1 голос
/ 06 февраля 2019

Почти каждый ответ здесь утверждает, что это может быть вызвано только бесконечным циклом.Это неправда, в противном случае вы могли бы перегрузить стек через глубоко вложенные вызовы (не говоря уже о том, что это эффективно, но, безусловно, это возможно).Если у вас есть контроль над вашей виртуальной машиной JavaScript, вы можете настроить размер стека.Например:

node --stack-size=2000

См. Также: Как увеличить максимальный размер стека вызовов в Node.js

0 голосов
/ 03 августа 2017

я тоже сталкивался с подобной проблемой вот подробности при загрузке логотипа с помощью выпадающего списка загрузки логотипа

<div>
      <div class="uploader greyLogoBox" id="uploader" flex="64" onclick="$('#filePhoto').click()">
        <img id="imageBox" src="{{ $ctrl.companyLogoUrl }}" alt=""/>
        <input type="file" name="userprofile_picture"  id="filePhoto" ngf-select="$ctrl.createUploadLogoRequest()"/>
        <md-icon ng-if="!$ctrl.isLogoPresent" class="upload-icon" md-font-set="material-icons">cloud_upload</md-icon>
        <div ng-if="!$ctrl.isLogoPresent" class="text">Drag and drop a file here, or click to upload</div>
      </div>
      <script type="text/javascript">
          var imageLoader = document.getElementById('filePhoto');
          imageLoader.addEventListener('change', handleImage, false);

          function handleImage(e) {
              var reader = new FileReader();
              reader.onload = function (event) {

                  $('.uploader img').attr('src',event.target.result);
              }
              reader.readAsDataURL(e.target.files[0]);
          }
      </script>
      </div>

CSS.css

.uploader {
  position:relative;
  overflow:hidden;
  height:100px;
  max-width: 75%;
  margin: auto;
  text-align: center;

  img{
    max-width: 464px;
    max-height: 100px;
    z-index:1;
    border:none;
  }

  .drag-drop-zone {
    background: rgba(0, 0, 0, 0.04);
    border: 1px solid rgba(0, 0, 0, 0.12);
    padding: 32px;
  }
}

.uploader img{
  max-width: 464px;
  max-height: 100px;
  z-index:1;
  border:none;
}



.greyLogoBox {
  width: 100%;
  background: #EBEBEB;
  border: 1px solid #D7D7D7;
  text-align: center;
  height: 100px;
  padding-top: 22px;
  box-sizing: border-box;
}


#filePhoto{
  position:absolute;
  width:464px;
  height:100px;
  left:0;
  top:0;
  z-index:2;
  opacity:0;
  cursor:pointer;
}

до исправления мой код был:

function handleImage(e) {
              var reader = new FileReader();
              reader.onload = function (event) {
                  onclick="$('#filePhoto').click()"
                  $('.uploader img').attr('src',event.target.result);
              }
              reader.readAsDataURL(e.target.files[0]);
          }

Ошибка в консоли:

enter image description here

Я решил это, удалив onclick="$('#filePhoto').click()" из тега div.

0 голосов
/ 02 января 2019

T̶h̶i̶s̶ ̶c̶a̶n̶ ̶h̶a̶p̶p̶e̶n̶ ̶w̶h̶e̶n̶ ̶y̶o̶u̶ ̶t̶r̶y̶ ̶p̶u̶s̶h̶ ̶a̶n̶ ̶a̶r̶r̶a̶y̶ ̶i̶n̶ * wrongСпасибо @melpomene за исправление.

Я получил ошибку в консоли AWS cloud 9, и удаление вышеуказанного кода устранило проблему.Я вернусь к коду и выясню реальную причину его исправления и обновлю его здесь.

0 голосов
/ 13 ноября 2018

Я пытался присвоить переменной значение, когда эта переменная не была объявлена.

Объявление переменной исправило мою ошибку.

0 голосов
/ 22 ноября 2018

Проверьте, есть ли у вас функция, которая вызывает сама себя. Например

export default class DateUtils {
  static now = (): Date => {
    return DateUtils.now()
  }
}
0 голосов
/ 25 июля 2018

Проблема в моем случае заключается в том, что у меня есть дочерний маршрут с тем же путем, что и родительский:

const routes: Routes = [
  {
    path: '',
    component: HomeComponent,
    children: [
      { path: '', redirectTo: 'home', pathMatch: 'prefix' },
      { path: 'home', loadChildren: './home.module#HomeModule' },
    ]
  }
];

Поэтому мне пришлось удалить строку дочернего маршрута

const routes: Routes = [
  {
    path: '',
    component: HomeComponent,
    children: [
      { path: 'home', loadChildren: './home.module#HomeModule' },
    ]
  }
];
0 голосов
/ 29 августа 2018

в моем случае я получаю эту ошибку при вызове ajax, и данные, которые я пытался передать этой переменной, не определены, то есть показывает эту ошибку, но не описывает эту переменную, не определенную. Я добавил определил, что переменная n получила значение.

0 голосов
/ 30 января 2018

Если вы работаете с картами Google, проверьте, передаются ли значения в new google.maps.LatLng в правильном формате. В моем случае они передавались как неопределенные.

0 голосов
/ 28 июня 2018

Иногда это происходило из-за типа данных для преобразования, например, у вас есть объект, который вы рассматривали как строку.

socket.id в nodejs или в клиенте js, например, не является строкой.чтобы использовать его как строку, вы должны добавить слово String перед:

String(socket.id);
...