2011-01-15 10 views
1

Ich habe einen Ajax-Aufruf und möchte es zurückrufen, sobald ich das Ergebnis in der Seite analysiere und animiere. Und da bleibe ich stecken.Javascript Rekursion

Ich konnte die Funktion abrufen, aber es scheint die Verzögerungen in der Animation nicht zu berücksichtigen. d. h. die Konsole gibt die Werte in einem wilden Tempo aus.

Ich dachte setInterval mit dem Intervall der Summe der Länge meiner Verzögerungen helfen könnte, aber ich kann das nicht ...

function loadEm(){ 
    var result=new Array();  
    $.getJSON("jsonCall.php",function(results){ 
     $.each(results, function(i, res){ 
      rand = (Math.floor(Math.random()*11)*1000)+2000; 
      fullRand += rand; 
      console.log(fullRand); 
      $("tr:first").delay(rand).queue(function(next) { 
      doStuff(res); 
       next(); 
      }); 
     }); 
     var int=self.setInterval("loadEm()",fullRand); 
    }); 
    } 
}); 

Antwort

3
  1. Verwendung setTimeout zu arbeiten. setInterval wird erneut aufgerufen ... und wieder ... und wieder ...

  2. Verwenden Sie var fullRand an der Spitze von loadElm (oder innerhalb des JSON-Rückrufs). Ohne es werden Sie die gleiche globale Variable bei jedem Aufruf von loadElm inkrementieren. In der Tat sollten Sie var mit alle Ihre lokalen Variablen verwenden - das schließt rand hier ein. The Jibbering JavaScript Closure Notes umfasst Variablen und vieles mehr.

  3. Verwenden Sie setTimeout(loadElm, fullRand) - verwenden Sie keine Zeichenfolge im ersten Parameter :) Siehe MDC setTimeout documentation.

  4. prüfen JavaScript-Fehler (halten firebug/IE-Entwickler-Tools/die Fehlerkonsole handlich)

  5. Statt setTimeout zu verwenden, betrachten Zählung zu halten, wie viele der Animationen fertig sind gegen wie viele insgesamt abgeschlossen haben ! Stell dir vor:

===

// closure in JSON callback. see Jibbering notes. 
var count = 0 
$.each(results, function(i, res) { 
    var rand = (Math.floor(Math.random()*11)*1000)+2000 
    count++ // have to do action 
    $("tr:first").delay(rand).queue(function(next) { 
    ... 
    count-- // action done 
    if (!count) { // means count == 0 here :-) then... 
     loadElm() // ...all actions done 
    } 
    }) 
}) 
if (!count) { 
    // err... no animations started :(
} 

Glücklich Codierung.

+0

Danke! Ich werde es implementieren und Sie wissen lassen! – rpophessagr

+0

Das Zählen hat wirklich geholfen! Vielen Dank! – rpophessagr