我的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
模块。
答案 0 :(得分:1)
如果您收到有关超出调用堆栈大小的错误,则可能是您正在调用的函数中的递归问题,而不是while
循环。你正在循环中进行异步post()
调用,并且可能会有一些递归。您可以通过注释掉整个post()
块来查看它是否有效,然后只注释回调内的代码。找到它实际发生的地方。
唯一的另一种可能性是,在此代码运行时,您的调用堆栈已经非常深,因此运行这样的普通代码超出了最大调用堆栈大小。通过在循环中抛出异常并查看调用堆栈的深度,这很容易测试。
修改强>
看起来你可能正在使用迈克尔的request模块。我一直都在使用它。我不知道你的dom
变量引用了什么。根据您在post()
来电中传递的选项以及dom.load()
正在做什么,我可以很容易地看到您的问题是其中之一。