即使只进行1次迭代,也会超出最大调用堆栈大小

时间:2014-04-16 04:55:47

标签: node.js while-loop callstack

我的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

其他信息:clientrequest模块,domcheerio模块。

1 个答案:

答案 0 :(得分:1)

如果您收到有关超出调用堆栈大小的错误,则可能是您正在调用的函数中的递归问题,而不是while循环。你正在循环中进行异步post()调用,并且可能会有一些递归。您可以通过注释掉整个post()块来查看它是否有效,然后只注释回调内的代码。找到它实际发生的地方。

唯一的另一种可能性是,在此代码运行时,您的调用堆栈已经非常深,因此运行这样的普通代码超出了最大调用堆栈大小。通过在循环中抛出异常并查看调用堆栈的深度,这很容易测试。

修改

看起来你可能正在使用迈克尔的request模块。我一直都在使用它。我不知道你的dom变量引用了什么。根据您在post()来电中传递的选项以及dom.load()正在做什么,我可以很容易地看到您的问题是其中之一。