2016-07-29 118 views
0

我已经有same question as earlier,但无法将答案与我的代码相关联。这是我的错误:RangeError: Maximum call stack size exceededNode.js最大调用堆栈超出

我的代码的高度简化的伪版本是这样的:

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); 

    }  
}); 

我已经试过包装在setImmediate内部make_requestsetTimeout其中包括一些其他的黑客,但似乎没有任何防止调用堆栈错误。我可以添加任何可以使其工作的库。任何想法将不胜感激。

+0

这里有太多的伪代码来查看真正发生了什么。我们需要看到REAL代码。因为你在你的问题中有代码,所以它几乎没有做任何事情,因为if(my_arr =='')'永远不会成真,所以代码做了几个数据库查询并且从不做任何结果。到目前为止,没有什么可看的。我不认为这个代码会产生你的错误。还有比你在这里展示的更多。 – jfriend00

+0

Jfriend00 my_arr ==''将在50%的时间内为真。这有帮助吗? –

+0

我的代码超长,但它基本上是一个涉及一个http请求的函数,它通常在它自己内部被调用。是不是有一个通用的解决方案? –

回答

1

如果我正确地阅读代码,块

 if(my_arr==''){ 
      // generate new url to make new request 
      function make_request(url, other_params); 
    } 

重新定义make_request是一个空函数。你不想拨打它是一个这一点,而不是?我认为空重定义会给你一个无法终止的间接递归。

+0

呐喊并不意味着在那里添加'功能'关键字。查看编辑的代码。 –

1

试着改变你的代码

function make_request(url, other_params, callback){ // all async function mast have callback 
    // Hmmm... 
    // request(url, function(response){ 
    request(url, function(err, response){ // according by doc - https://github.com/request/request 
     // Use short notation 
     var some_var = (smth) ? 'some-value' : ''; 

     // do-smth. Mayby problem is here? 

     var my_arr = [some_var]; 
     connection.query('INSERT my_table SET name = ?', my_arr, function(err, rows, fields) { 
      // Always check error 
      if(err) 
       return callback(err); 

      // I don't understand what is it. If some_var == '' then my_arr == [], not '' 
      // In any case this check must do on upper level 
      /* 
      if(my_arr=='') 
       make_request(url, other_params); 
      */ 
      callback(null, rows); // return data  
     }); 
    }); 
} 


var async = require('async'); 

connection.query('SELECT url from my_table', function(err, rows, fields){ // if you need one field then don't request all 
    // I repeat: Always check error. SQL can be correct, but db is busy. 
    if (err) 
     return console.log(err.message); 

    async.mapSeries(rows, make_request, function(err, results) { 
     if (err) 
      return console.log(err); 

     // do smth with results 
     console.log(results); 
    });  
}); 

附: heinob在prev你的问题做出非常好的答案。

相关问题