2016-07-29 20 views
0

Ich habe die same question as earlier aber Probleme mit der Beantwortung der Antworten auf meinen Code. Hier ist mein Fehler: RangeError: Maximum call stack size exceeded.Node.js maximale Call-Stack überschritten

Die stark vereinfachte Pseudo Version meines Code ist dies:

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

    }  
}); 

Ich habe versucht, die internen make_request in setImmediate oder setTimeout unter einigen anderen Hacks Einwickeln, aber nichts scheint die Call-Stack-Fehler zu verhindern. Ich kann jede Bibliothek hinzufügen, die das funktioniert. Irgendwelche Gedanken würden geschätzt werden.

+0

Es gibt zu viel Pseudocode hier, um zu sehen, was wirklich los ist. Wir müssen den REAL-Code sehen. Wie Sie den Code in Ihrer Frage haben, tut es kaum etwas, weil 'if (my_arr == '')' wird nie wahr, so macht der Code ein paar DB-Abfragen und macht nie etwas mit den Ergebnissen. Hier ist nichts zu sehen. Ich glaube nicht, dass dieser Code Ihren Fehler erzeugen würde. Es gibt mehr, als Sie hier zeigen. – jfriend00

+0

Jfriend00 my_arr == '' wird in 50% der Fälle wahr. Ist das hilfreich? –

+0

Mein Code ist sehr lang, aber es ist im Grunde eine Funktion, die eine HTTP-Anfrage beinhaltet, die oft in sich selbst aufgerufen wird. Gibt es dafür keine verallgemeinerbare Lösung? –

Antwort

1

Wenn ich den Code richtig zu lesen, wird der Block

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

setzt neue Maßstäbe für make_request eine Null-Funktion. Willst du nicht Anruf es an diesem Punkt, stattdessen? Ich denke, dass die Nullneudefinition eine indirekte Rekursion hinterlassen würde, die nicht beendet werden kann.

+0

Whoops wollte das Schlüsselwort 'function' nicht hinzufügen. Siehe bearbeiteten Code. –

1

Versuchen Sie Ihren Code

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

P. S. ändern heinob in prev Ihre Frage machen sehr gute Antwort.