Превышен максимальный размер стека вызовов даже за одну итерацию
Мой цикл 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()
делает, я мог легко увидеть вашу проблему, являющуюся одним из тех.