2017-04-13 24 views
0

ノードアプリケーションでグローバル変数を更新できません。誰かが自分のコードを見て、何がうまくいかないのかを教えてくれますか? HTTP応答オブジェクトに「次」が定義されていない限り、実行するdowhileループを定義しました。ループの中では、物事は期待どおりに実行されており、new_json.nextは定義されていますが、new_json.nextはそこで定義されていないため、while条件はエラーを返しています。私はJavascriptでちょっと新しいので、どういうわけか私の可変スコープはオフですが、他の質問に基づいて正しく動作する方法を理解することはできません。Javascriptでグローバル変数を更新できません

function make_pagination_request(json, create_response_data) {  


     var new_json={}; 
     do {  

      var options = { 
       host: slug + '.nationbuilder.com', //should be replaced to be site-agnostic 
       path: json.next, 
       method: "GET", 
       json: true, 
       headers: { 
        "content-type": "application/json", 
        "accept": "application/json" 
       }, 
      }  

      var req = https.get(options, req_callback);  


      function req_callback(response) { 
       response.on('data', function(chunk) { 
        str += chunk; 
       });  

       response.on('end', function(new_json) {  

        new_json=JSON.parse(str); 
        new_results = new_json.results 
        results= results.concat(new_results); 
        console.log("combinedlength: " + results.length) 
        console.log(new_json.next); 


       }); 
      } 
     } while (new_json.next.includes("api")); 

答えて

1

問題は、do/whileサイクルが同期しているときにHTTPs要求が非同期であることです。この場合、nextを含む値がnew_json変数に割り当てられる前に、whileステートメントに達します。

while文が初めて呼び出されたときに、コールバック関数がまだ呼び出されていないとき。したがって、new_jsonの値は{}(初期値)であり、nextがありません。したがって、発生しているエラーです。

しかし、解決策は初期値のnew_jsonを固定していません。これを解決するには、do/whileループを削除し、HTTPリクエストコールバック内で作業を続行する必要があります。

+0

私はそのようなものだったはずでした。これは私が理解し始めたばかりのものであり、他のいくつかの問題の根源になっています。私は、単にmake_pagination_requestという関数をそれ自身の終わりから呼び出すことになりました。 –

+1

Javascriptコードとその言語に含まれる同期構造の非同期性は、多くのプログラマにとって大きな問題の原因となっています。あなたのコメントでは、同じ関数を再度呼び出すことによって問題を解決することができます。それが機能しても、私はあなたがスタックオーバーフローの問題に到達する関数が何度も呼び出されるので、より良い解を研究することをお勧めします。 – yeiniel

+0

私はすでに冗談であるスタックオーバーフローの問題 –

0

ここに私のコードがあります。ありがとうございました。私は、単にmake_pagination_requestという関数をそれ自身の終わりから呼び出すことになりました。元の問題には関係していなかったが、デバッグには必要な変更を行った。

function make_pagination_request(json, create_response_data, callback, tokens, options) {   

      path = json.next + "&access_token=" + tokens[slug];  


      var options = { 
       host: slug + '.nationbuilder.com', //should be replaced to be site-agnostic 
       path: path, 
       method: "GET", 
       json: true, 
       headers: { 
        "content-type": "application/json", 
        "accept": "application/json" 
       }, 
      }  

      var str='';   

      var req = https.get(options, req_callback);   


      function req_callback(response, create_response_scripts) { 
       response.on('data', function(chunk) {  

        str += chunk; 
       });   

       response.on('end', function() { 

        new_json=JSON.parse(str); 
        new_results = new_json.results 
        results= results.concat(new_results); 
        console.log('combined_length: ' + results.length) 


        if (new_json.next) { 
         make_pagination_request(new_json, create_response_data,create_response_scripts, tokens, options); 
        } else { 
         create_response_data(results, query, create_response_scripts); 
        } 


       }); 
      } 
     } 
関連する問題