【问题标题】:Node.js RangeError: Maximum call stack size exceededNode.js RangeError:超出最大调用堆栈大小
【发布时间】:2020-05-02 02:50:32
【问题描述】:

我正在尝试从我的数组productsDeduped 生成所有可能的名称组合,然后将生成的组合存储为productTags 数组。这是我的代码:

//function to generate all possible combinations
function getCombinations(array) {
    var i,
        result = [];
    for (i = 0; i < array.length; i++) {
        result.push(
            array[i],
            ...getCombinations(array.filter((_, j) => i !== j)).map(v => array[i] + " " + v)
        );
    }

    return result;
}

for (var i = 0; i < arrLength; i++) {
    var productNameStrings = getCombinations(productsDeduped[i].tags);

    productsDeduped[i].productTags = productNameStrings   
}

我得到这个错误:

          result.push(
           ^

RangeError: Maximum call stack size exceeded
    at getCombinations (/Users/farhadam/Silobee/Inventory/categories/execute.js:1006:16)
    at Object.<anonymous> (/Users/farhadam/Silobee/Inventory/categories/execute.js:1016:30)
    at Module._compile (internal/modules/cjs/loader.js:1156:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1176:10)
    at Module.load (internal/modules/cjs/loader.js:1000:32)
    at Function.Module._load (internal/modules/cjs/loader.js:899:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)

知道如何解决这个问题;我认为是因为请求量很大?

编辑: 我只是看得更深,当我将我的 productNameStrings 字符串数组限制为只有 9 个元素时,代码可以正常工作;但如果它在数组中有 10 个或更多字符串,它就会开始给我这个错误!还是不知道怎么解决。

【问题讨论】:

  • 首先,您可以将结果数组声明移出函数,因为每次递归到函数中时,都会重新创建它。另一种方法是将其作为单独的参数传递给函数。
  • 我认为大容量不是问题,而是调用堆栈大小,即每个输入形成多少递归迭代(我猜现在是 9)。一种称为动态编程的不同问题解决方法在这里会有所帮助,通过记忆以前的结果,您可以减少堆栈大小。
  • 我是个小新手;我该怎么做呢?不确定如何将其编码为单独的参数!?谢谢!
  • 我也将结果变量移出函数,但仍然出现相同的错误 - 尽管我确实希望每次返回循环时数组都开始为空,因为它会是一个新产品
  • 每次你的代码调用一个函数时,runtime都会把当前的代码状态压入一个栈中,并在代码返回时将其弹出。这就是您收到“超出调用堆栈大小”错误的原因:堆栈已满,可连续推送 (getCombinations()) 而不会弹出 (return)。这是递归代码的常见问题。你能举例说明输入数组和输出数组是什么样的吗?

标签: javascript arrays node.js loops stack-size


【解决方案1】:

您可以在这里查看。可能你无法摆脱递归循环。

递归函数继续调用自身的问题 是不可能在一个 链,你会吃光你的全部堆栈。

防止此错误的最佳方法是仔细检查您的递归函数。

https://airbrake.io/blog/javascript-error-handling/javascript-error-handling-maximum-call-stack-size-exceeded

另一个来源: https://www.educative.io/edpresso/rangeerror-maximum-call-stack-size-exceeded

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2014-12-03
    • 2018-02-06
    • 2018-07-29
    • 1970-01-01
    • 2015-08-09
    • 2021-05-30
    相关资源
    最近更新 更多