2017-04-13 4 views
0

Ich habe Probleme beim Aktualisieren einer globalen Variablen in meiner Knoten App. Kann jemand meinen Code ansehen und mich wissen lassen, was schief läuft? Ich habe eine Dowhile-Schleife definiert, die ausgeführt wird, solange mein HTTP-Antwortobjekt nicht "next" definiert hat. Innerhalb der Schleife laufen die Dinge wie erwartet und new_json.next ist definiert, aber die while-Bedingung gibt einen Fehler zurück, weil new_json.next dort nicht definiert ist. Ich bin ein wenig neu in Javascript, also irgendwie ist mein variabler Bereich ausgeschaltet, aber ich kann nicht herausfinden, wie man Dinge richtig macht, basierend auf anderen Fragen.Problem beim Aktualisieren der globalen Variablen in 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")); 

Antwort

1

Das Problem ist, dass die HTTPs-Anfrage asynchron ist, während der Do/While-Zyklus synchron ist. In diesem Fall wird die while-Anweisung erreicht, bevor der Variablen new_json ein Wert zugewiesen wird, der next enthält.

Wenn die while-Anweisung das erste Mal erreicht wird, wurde die Callback-Funktion noch nicht aufgerufen. Daher ist der Wert new_json{} (der Anfangswert) und es fehlt next. Daher der Fehler, den Sie erleben.

Aber die Lösung fixiert nicht den Anfangswert von new_json. Die Lösung besteht darin, die do/while-Schleife zu entfernen und die Arbeit im HTTPs-Request-Callback fortzusetzen.

+0

Ich hätte wissen müssen, dass es so etwas war. Das beginne ich erst zu verstehen und es ist die Wurzel einiger meiner anderen Probleme. Am Ende habe ich einfach die Funktion make_pagination_request aufgerufen. –

+1

Die asynchrone Natur des Javascript-Codes und die synchronen Konstrukte, die in der Sprache enthalten sind, waren eine große Quelle von Problemen für viele Programmierer. Ich sehe in Ihrem Kommentar, dass es Ihnen gelingt, das Problem zu lösen, indem Sie die gleiche Funktion erneut aufrufen. Selbst wenn es funktioniert, empfehle ich Ihnen, nach einer besseren Lösung zu suchen, denn wenn sich die Funktion selbst viele Male aufruft, werden Sie einen Stapelüberlauf erreichen. – yeiniel

+0

Ich dachte, ich hätte bereits einen Stapelüberlauf –

0

Hier ist mein Code, den ich funktionierte. Danke, Yeiniel. Am Ende habe ich einfach die Funktion make_pagination_request aufgerufen. Ich machte auch einige andere Änderungen, die nicht mit dem ursprünglichen Problem zusammenhingen, aber für das Debugging notwendig waren.

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


       }); 
      } 
     } 
Verwandte Themen