2017-06-24 4 views
0

Ich mache einfache App in Javascript. Ich habe "main_script", wo ich alles anrufe. Es gibt globale Variable "Feeds", die ein Array ist, wie folgt aus:JavaScript Anonyme Funktion in Funktion verhält sich seltsam

var feeds = []; 

Dann nach, dass ich verwenden Funktion, die Lasten JSON-Datei von multipe URLs (auch Array):

feeds = LoadJsonFeeds(urls); // Load feeds 
console.log("main_code feeds.length: " + feeds.length); 

Diese Konsole log erwähne ich später. Ok, und jetzt ist er mein LoadJsonFeeds (in verschiedener JS-Datei, nur eine Funktion):

function LoadJsonFeeds(urls) { 
    var feeds_tmp = []; 
    // URLs can be more - for example 50 feeds from url[0] and 20 from url[1] 
    for(var u = 0; u < url.length; u++) { 
     $.getJSON(url[u], function(data) { 
      var allFeeds = data.Result.Items; // allFeeds without check if they are ok 
      for(var i = 0; i < allFeeds.length; i++) { 
       // Is feed ok? 
       if (allFeeds[i].Text != null) 
       { 
        // Some more checking, but lets say ok for this 
        feeds_tmp.push(allFeeds[i]); 
       } 
       // This I mention later 
       console.log("LoadJson feeds.length: " + feeds.length); 
      } 
     }); 
    } 
    console.log("LoadJson return"); // Mention later 
    return feeds_tmp; 
} 

Und hier ist das Problem, mit denen ich zu kämpfen. Wenn ich auf die Konsole schaue, hier, was ich sehe:

LoadJson return 
main_code feeds.length: 0 
LoadJson feeds.length: 1 
LoadJson feeds.length: 2 
LoadJson feeds.length: 3 
etc... 

Ich sehe einfach nicht die Logik dahinter! Wie kann es zuerst die Funktion mit nichts zurückgeben, dann wird das main_script fortgesetzt. Danach "füttert" die Funktion ALTER nacheinander die globale Variable. Ich vermute die anonyme Funktion, weiß aber nicht, was ich damit anfangen soll.

Was versuche ich zu erreichen? Einfach, ich wollte Funktion haben, die JSON-Dateien von URLs lädt. Zum Beispiel hat URL [0] 50 Feeds, URL [1] hat 20. Wenn alles in Ordnung ist, sollte es Array von 70 Feeds zurückgeben. Ich benutze das zum ersten Mal in main_script und dann im Intervall für das Update, das ich alle paar Sekunden anrufe. In dieser Funktion überprüfe ich, welche Feed neu und setze es woanders:

function UpdateFeeds(url) { 
    console.log("updating..."); 

    var feeds_tmp = LoadJsonFeeds(url); 
    console.log("Update feeds_tmp.length: " + feeds_tmp.length); // This is 0 
    for(var f_tmp = 0; f_tmp < feeds_tmp.length; f_tmp++) { // This does not happen because feeds_tmp.length = 0 
     for(var f = 0; f < feeds.length; f++) { 
      // Check what feed is new and put it somewhere else (the new one) 
      } 
     } 
    } 
    feeds = feeds_tmp; // Make all new feeds the global variable 
} 

Aber da das zurückgegebene Array 0, bedeutet das forloop nicht passieren. Aber es wird trotzdem die globale Variable "feeds" ändern. Für die Hauptfunktion ist es egal. In der globalen Variable sind die Daten drin, aber ich muss wirklich neue finden und etwas damit arbeiten. Aber da es nicht so funktioniert, bin ich ziemlich verloren.

Was fehlt mir und wie kann ich das beheben? Vielen Dank!

+2

asynchronen Code ist immer asynchron: p –

+0

.. es sei denn, Sie absichtlich machen Sie es synchron mit etwas wie [async] (https://github.com/caolan/async). – Ville

Antwort

1

Ihre console.log("LoadJson feeds.length: " + feeds.length); genannt später, weil es ist ein asynchroner Aufruf, diese Funktion als

aktualisieren
function LoadJsonFeeds(urls,callback) { 
    var feeds_tmp = []; 
    // URLs can be more - for example 50 feeds from url[0] and 20 from url[1] 
    for(var u = 0; u < url.length; u++) { 
     $.getJSON(url[u], function(data) { 
      var allFeeds = data.Result.Items; // allFeeds without check if they are ok 
      for(var i = 0; i < allFeeds.length; i++) { 
       // Is feed ok? 
       if (allFeeds[i].Text != null) 
       { 
        // Some more checking, but lets say ok for this 
        feeds_tmp.push(allFeeds[i]); 
       } 
       // This I mention later 
       console.log("LoadJson feeds.length: " + feeds.length); 
      } 
       if(u==url.length.1) // to make sure all URL loaded 
       callback(feeds_tmp) 
     }); 
    } 

} 

Und rufen Sie Ihre Funktion als

 feeds = LoadJsonFeeds(urls,function(feeds){ 
console.log("main_code feeds.length: " + feeds.length); 

}); // Load feeds 
+0

Natürlich sind diese Kommentare nur um zu zeigen, was passiert. Danke, ich werde es versuchen. Ich hatte den Verdacht, Callback zu verwenden, aber ich bin ziemlich neu in Javascript. – Stepan

Verwandte Themen