2016-12-07 2 views
-1

Ich habe eine JSON, die Liste der serialisierten Objekte enthält. Und ich möchte diesen JSON gehen und Nachrichten davon eine Nachricht pro 2 Sekunden zeigen und dann aufhören. ich es auf diese Weise tat:jquery Timeout innerhalb der Schleife funktioniert nicht

$.ajax({ 
     type: 'GET', 
     url: basename+'/getUnprocessedList/123', 
     dataType: 'jsonp', 
     success: function (data) { 
     for(var i=0, keys=Object.keys(data), l=keys.length; i<l; i++) { 
      console.log('hit '+i); 
      setInterval(processMessage(data[i]),2000); 
      }} 
}); 

Aber nichts dort zu arbeiten, setInterval nur ignoriert, werden alle Nachrichten auf einmal angezeigt, wie kein jeder Timeout. Ich habe versucht, $ .Each, setTimeout, nichts funktioniert. Was ist da falsch?

+0

'processMessage (data [i])' ruft sofort die Funktion auf. – nicovank

+0

Siehe http://stackoverflow.com/questions/32770286/javascript-settimeout-doesnt-seem-to-work-like-i-expect in Bezug darauf, wie Sie 'setInterval()' und http: // stackoverflow aufrufen. com/questions/1451009/javascript-infamous-loop-issue bezüglich der Verwendung der Variable 'i'. – Barmar

Antwort

0

Es ist, weil Sie die Funktion sofort im setInterval Aufruf sind aufgerufen wird - eine Funktion zu übergeben, lassen Sie die () - aber da Sie eine param benötigen - verwenden eine anonyme Funktion:

setInterval(function() { processMessage(data[i]) },2000); 

Und Sie‘ ll wahrscheinlich in die Frage läuft von i jetzt falsch sein (weil i wird die letzte Iteration zum Zeitpunkt der Ausführung sein, so einwickeln, dass in einem IIFE)

(function(i) { 
    setInterval(function() { processMessage(data[i]) },2000); 
})(i) 

ODER - wenn Sie können, verwenden let in Ihrer for Schleife:

for(let i=0, keys=Object.keys(data), l=keys.length; i<l; i++) { 
    setInterval(function() { processMessage(data[i]) },2000); 
} 
+0

das würde immer noch nicht funktionieren, Daten [i] ist außerhalb des Geltungsbereichs. – Derek

+0

@Derek - Wurde bearbeitet. – tymeJV

+0

Ahhh, ich sehe jetzt. Entfernte DV. – Derek

2

zu viele Fehler in dieser einer Zeile zu zählen:

 setInterval(processMessage(data[i]),2000); 

korrekte Version:

setTimeout((function(i){return function(){processMessage(data[i])}})(i), 2000*i); 

Ihre Probleme:

  • Sie‘ re Aufruf der Funktion sofort - wrap es in einer Funktion
  • i bis Ende außerhalb des Gültigkeitsbereiches gehen - wickeln Sie Ihre Funktion in einem Verschluss
  • Verwendung setTimeout mit gestaffelten Abständen statt, um es einfacher den Überblick über i
+0

Warum der Downvote? Ich habe getestet - es funktioniert. – Scimonster

+0

Danke, nur überprüft - es schreibt Hit + i 5 mal, dann wartet, dann alle 5 Nachrichten auf einmal. Keine konsequente Nachrichtenübertragung bis jetzt :( – avalon

+0

@avalon Sie schlossen das '2000 * i 'ein? – Scimonster

1

zu halten statt Mit einer for-Schleife können Sie Ihre eigene Schleife in setInterval machen.

success: function (data) { 
    var i=0, keys=Object.keys(data), l=keys.length; 
    var t=setInterval(function(){ 
     processMessage(data[i]); 
     if(++i==l){clearInterval(t)} 
    }, 2000); 
} 

Dies wird alle 2 Sekunden wiederholt und endet, wenn das Ende erreicht ist.

+0

Ok danke! Es ist sehr hilfreich! – avalon

Verwandte Themen