Превышен максимальный размер стека вызовов даже за одну итерацию

Мой цикл while выдает ошибку превышения размера стека вызовов, поэтому я попытался ограничить его некоторыми способами, которые не работали, и теперь у меня есть следующий фрагмент:

var hasnext = true;
while(hasnext) {
  options.form['formBusca:dataScroller1'] = (++page).toString();

  var request = client.post(options, function(error, response, body) {
    var html = dom.load(body);
    var buttons = html('td.rich-datascr-button');
    if (some_length_condition_that_does_not_matter) {
      hasnext = false;
    }
  });
  process.stdout.write((page).toString() + '\r');
  break;
}

Если логика, которую я выучил, все еще остается той же в наше время, это время должно выполняться один раз и только один раз, так как его последний оператор - это разрыв без условия, поэтому он должен закончиться после завершения первой итерации.

Однако это не работает. В каком-то смысле я превышаю стек вызовов каждый раз. Почему это происходит, и как я могу предотвратить это?

RangeError: Maximum call stack size exceeded

Дополнительная информация: client это request модуль и dom это cheerio модуль.

1 ответ

Если вы получаете сообщение об превышении размера стека вызовов, вероятно, это проблема рекурсии в функции, которую вы вызываете, а не в while петля. Вы делаете асинхронный post() вызов внутри цикла, и, вероятно, там что-то повторяется. Вы можете проверить, закомментировав весь post() заблокировать, чтобы увидеть, работает ли он, а затем закомментировать только код внутри обратного вызова. Найдите, где это на самом деле происходит.

Единственная другая возможность состоит в том, что ваш стек вызовов уже очень глубок к тому времени, когда этот код выполняется, и поэтому выполнение нормального кода, подобного этому, превышает максимальный размер стека вызовов. Это легко проверить, просто бросив исключение в цикле и посмотрев, насколько глубоким является ваш стек вызовов.

РЕДАКТИРОВАТЬ

Похоже, вы можете использовать модуль запроса от mikeal. Я использую это все время. Я понятия не имею, что вы dom переменная ссылается, хотя. В зависимости от того, какие варианты вы передаете в вашем post() позвонить и что dom.load() делает, я мог легко увидеть вашу проблему, являющуюся одним из тех.

Другие вопросы по тегам