2016-07-29 16 views
0

私はsame question as earlierを持っていますが、私のコードへの回答に問題があります。私のエラーはRangeError: Maximum call stack size exceededです。Node.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またはsetTimeoutで内部make_requestをラップ試してみたが、何もコールスタックエラーを防ぐように思いません。私はこの作業をするライブラリを追加することができます。いかなる考えも認められるだろう。

+0

実際に何が起こっているかを見るには、ここに擬似コードが多すぎます。 REALコードを見る必要があります。あなたの質問にはコードがあるので、 'if(my_arr == '')'は決して真ではないので、ほとんど何もしないので、コードはいくつかのDBクエリを行い、決して結果を何もしません。今のところここには何も見えません。私はこのコードはあなたのエラーを生成するとは思わない。あなたがここに示すよりも多くのことがあります。 – jfriend00

+0

Jfriend00 my_arr == ''は時間の50%に当てはまります。それは役に立ちましたか? –

+0

私のコードは超ロングですが、基本的にはHTTPリクエストを含む1つの関数で、しばしば内部で呼び出されます。それに対して一般化可能な解決法はないのですか? –

答えて

1

私はコードを正しく読んでいる場合は、ブロック

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

がnullの関数であることがmake_requestを再定義します。 これを代わりに呼びたいと思っていますか?私はnullの再定義によって、終了する方法がない間接的な再帰が残されると思います。

+0

Whoopsは、そこに「function」キーワードを追加するつもりはありませんでした。編集されたコードを参照してください。 –

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

P.S.を変更してくださいheinobあなたの質問は非常に良い答えを作る前に。

関連する問題