【发布时间】:2016-12-04 18:01:22
【问题描述】:
我有same question as earlier,但无法将答案与我的代码联系起来。这是我的错误:RangeError: Maximum call stack size exceeded。
我的代码高度简化的伪版本是这样的:
function make_request(url, other_params){
request(url, function(response){
if(something) var some_var = 'some value';
else var some_var = '';
//do something with response to generate, some_var, and insert into DB
var my_arr = [some_var];
connection.query('INSERT my_table SET name = ?', my_arr, function(err, rows, fields) {
if(my_arr==''){
// generate new url to make new request
make_request(url, other_params);
}
});
});
}
connection.query('SELECT * from my_table', function(err, rows, fields){
var len =rows.length;
for(var i = 0; i < len; i++){
var url = rows[i].url;
make_request(url, other_params);
}
});
我尝试将内部make_request 包装在setImmediate 或setTimeout 中以及其他一些技巧中,但似乎没有什么可以阻止调用堆栈错误。我可以添加任何可以完成这项工作的库。任何想法将不胜感激。
【问题讨论】:
-
这里的伪代码太多了,看不出到底发生了什么。我们需要查看真实代码。由于您的问题中有代码,它几乎没有任何作用,因为
if(my_arr=='')永远不会为真,因此代码会进行一些数据库查询,并且从不对结果做任何事情。到目前为止,这里没有什么可看的。我不认为这段代码会产生你的错误。它比您在此处显示的要多。 -
Jfriend00 my_arr=='' 将在 50% 的情况下为真。这有帮助吗?
-
我的代码很长,但它基本上是一个涉及 http 请求的函数,它经常在内部被调用。没有通用的解决方案吗?
-
我们无法猜测问题出在哪里。我们必须查看导致问题的实际代码。据我所知,导致代码的问题不在您的问题中。删除您的问题或显示更多真实代码,以便我们真正为您提供帮助。要求我们进行疯狂的猜测并谈论他们,您不太可能得到很多人的帮助。
-
您可以从异步响应中递归调用,而不必担心堆栈溢出。如果你从同步代码中递归调用,那么如果你做的太多,就会有堆栈溢出的风险。在这两种情况下,您都必须适当地处理所有错误(以避免无限循环或堆栈溢出),并确保您完全了解递归如何在所有情况下正确终止。关于您的具体问题的进一步建议需要查看导致问题的代码。
标签: javascript node.js recursion node-mysql node-request