【问题标题】:Maximum call stack size exceeded even with only 1 iteration即使只有 1 次迭代,也超过了最大调用堆栈大小
【发布时间】:2014-05-30 18:52:03
【问题描述】:

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

如果我现在学到的逻辑还是一样的话,这个while应该执行一次,并且只执行一次,因为它的最后一条语句是无条件的break,所以它应该在完成第一次迭代后结束。

但是,这不起作用。在某种程度上,我每次都超过调用堆栈。为什么会发生,我该如何防止它发生?

RangeError: Maximum call stack size exceeded

附加信息:client 是 request 模块,dom 是 cheerio 模块。

【问题讨论】:

    标签: node.js while-loop callstack


    【解决方案1】:

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

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

    编辑

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

    【讨论】:

    • 我在答案中添加了我正在使用的模块。问题似乎出在请求模块上,因为如果我将其注释掉,它工作正常,但即使我在回调中注释了所有内容(所以我有function(error, response, body){},我得到堆栈错误。
    • 您将哪些选项传递给post()?
    • 我上传了代码here(搜索hasnext)。您可能会看到这条线并不算太深,我相信它不到 10 个级别。
    • 当它为您提供Maximum call stack size exceeded 时,它是否还为您提供了其他更有用的信息?也许有文件和行号?
    • 不,它没有。节点中是否有类似“调试模式”的更详细错误?
    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2015-08-03
    • 2020-01-05
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多