2012-03-29 5 views
0

Kann mir jemand sagen, warum das unten gibt mir eine leere Zeichenfolge? Wenn ich console.log(contentArray) in der Callback-Funktion $.get() zeigt es die Daten, aber wenn ich versuche, es zu tun, wo es in dem Code unten ist, ist das Ergebnis leer.jQuery .Push in ein Array in einem .get-Aufruf gibt ein leeres Ergebnis

sectionArray = []; 
contentArray = []; 
$(function() { 
    if (index == 1) { 
     $('menu:eq(' + (section - 1) + ') li a').each(function() { 
      sectionArray.push($(this).attr('href')); 
     }); 

     var len = sectionArray.length; 

     for (var i = 0; i < len; i++) { 
      href2 = sectionArray[i]; 

      $.get(href2, function (data) { 
       string = data.toString(); 
       contentArray.push(string); 
      }); 
     } 
     content = contentArray.toString(); 
     console.log(content); 
    } 

Antwort

2

weil Ajax-Anforderung endet, wenn Sie console.log() nennen versuchen Sie dies:

$.get(href2, function(data){ 
    string = data.toString(); 
    contentArray.push(string); 
    content = contentArray.toString(); 
    console.log(content); 
}); 

auch Ajax-Request in Schleife tun, ist nicht das Beste, was zu tun. das wird nicht funktionieren wie du willst.

UPDATE:

auch jQuery hat async Option auf false gesetzt und der Code sollte funktionieren, aber wird langsam arbeiten. Synchrone Anfragen können den Browser vorübergehend sperren.

UPDATE 2

vielleicht so etwas wie dies versucht (vielleicht nicht so gute Idee: D):

var countRequests = len; 
$.get(href2, function(data){ 
    string = data.toString(); 
    contentArray.push(string); 
    countRequests = countRequests - 1; 
    if (countRequests == 0) { 
     content = contentArray.toString(); 
     console.log(content); 
     // or create callback 
    } 
}); 
+0

, die, weil $ .get (href2, Funktion (Daten) { Inhalt funktioniert = contentArray.push (data); console.log (Inhalt); }); funktioniert. ich versuchte $ .get (href2, Funktion (data) { string = data.toString(); contentArray.push (string); }); content = contentArray.toString(); console.log (Inhalt); aber das funktioniert nicht – Psylant

+0

, dass '.push()' geht nach 'console.log()' – Vytautas

+0

Ich muss es in einer Schleife tun, weil ich Daten von mehreren Seiten sammeln müssen, dann fallen sie in 1 Seite – Psylant

1

Das Problem ist, dass Ihre $.get() AJAX-Anfragen asynchron ausgeführt werden.

Das heißt, die Funktion $.get()sofort kehrt für die Antwort, ohne zu warten, das gesamte für die Schleife vervollständigt (Schlange stehen mehrere ajax Anfragen), dann console.log() auftritt, an welchem ​​Punkt das Array ist noch leer. Erst danach wird einer der Ajax-Success-Handler aufgerufen, unabhängig davon, wie schnell die Ajax-Antworten zurückkommen.

EDIT: Hier ist eine Antwort von einer anderen Frage, die zeigt, wie etwas zu tun, nachdem alle Ajax-Aufrufe abgeschlossen haben: https://stackoverflow.com/a/6250103/615754

+0

ahhh ok das macht Sinn, also wenn ich sage eine if-Anweisung da hinein ausführen, sobald ich> len sollte das ausführen, nachdem die for-Schleife beendet ist? – Psylant

+0

Nein, die for-Schleife wird definitiv beendet, bevor einer der Erfolgsrückrufe ausgeführt wird. Eine if-Anweisung funktioniert nur, wenn Sie Ihre console.log() in den Callback verschieben und die Anzahl der erhaltenen Antworten beibehalten. Sehen Sie sich die Antwort an, mit der ich verlinkt habe, und lesen Sie sich die Methode $ .when() durch. – nnnnnn

+0

Das ist eigentlich wirklich eine nette Art, es zu tun. Vielen Dank – Psylant

Verwandte Themen