2017-07-26 2 views
1

Mein Ziel ist es, jedes der Koordinatenpaare in der coords Variable alle 5 Sekunden nacheinander auf die Konsole zu protokollieren. Ich kann dies mit jedem Paar in coords auf einmal mit der setInterval() Funktion tun, aber wie würde ich coords[0] bei 5 Sekunden, coords[1] bei 10 Sekunden, coords[2] bei 15 Sekunden, und so weiter - und dann neu beginnen, wenn Sie fertig sind ?For-Schleife mit setInterval() kombinieren

coords = [[ -122.68181, 45.523713333333333 ], [ -122.681848333333363, 45.52369833333335 ], 
[ -122.681996666666691, 45.523683333333338 ], [ -122.682078333333351, 45.523733333333332 ], 
[ -122.681916666666694, 45.523736666666665 ], [ -122.6815766666667, 45.523753333333346 ], 
[ -122.68182333333M3355, 45.523741666666659 ], [ -122.681823333333355, 45.523753333333339 ], 
[ -122.681656666666683, 45.52375 ], [ -122.68162833333335, 45.523738333333334 ], [ -122.681936666666701, 45.52373 ]] 

function listCoords() { 
    for (var i=0, l=coords.length; i<l; i++) { 
    console.log(coords[i]) 
    } 
} 

setInterval(function(){ 
listCoords() 
}, 5000); 

Antwort

4
var i=0; 
function listCoords() { 
    console.log(coords[i]) 
    i=(i+1)%coords.length; 
} 

setInterval(listCoords,5000); 

einfach eine globale Variable halten, die die Position neben zeigen speichert. Wenn die Funktion aufgerufen wird, zeigen Sie diesen Wert an, erhöhen Sie i und verhindern Sie, dass es außerhalb der Array-Grenzen springt. Dies funktioniert wie folgt:

eine Feldlänge von 3 vorstellen, itll tun

0 
(0+1)%3 = 1 
(1+1)%3 = 2 
(2+1)%3 = 0 // the loop starts again 

Alternativ einige Pseudo-Rekursion und Timeouts verwenden:

;/*a semicolon, just for Andy ;) */ 
(function next(i){ 
    console.log(coords[i]); 
    setTimeout(next,5000,(i+1)%coords.length);// show next one in 5 secs 
})(0);//start with 0 
+0

wie kann man verstehen 'i = ++% coords.length;'? –

0

einbetten setTimeout innerhalb der Funktion, dass die Anrufe Funktion nur, wenn der Index kleiner ist als die Länge von coords Hier verwenden wir einen sofort aufgerufenen Funktionsausdruck (IIFE), um coords und einen Anfangswert von i zu übergeben.

var listCoords = (function listCoords(coords, i) { 
    if (i && i <= coords.length) console.log(coords[i - 1]); 
    setTimeout(listCoords, 5000, coords, ++i) 
}(coords, 0)); 

DEMO - die Demo arbeitet bei 1 Sekunde statt 5.

+0

Was sollte global listCoords enthalten? (Es ist wahrscheinlich undefined) und wie unterscheidet sich das von meiner Antwort? –

+0

es tut, du hast gerade ein vergessen; hinter dem Array ... –

+0

Sorry, mein Fehler. Wahrscheinlich möchten Sie Ihren Code ändern, um in diesem Fall ein Semikolon vor der öffnenden Klammer hinzuzufügen. – Andy