2017-07-26 71 views
1

我的目标是每5秒钟连续将每个坐标对记录到coords变量中的控制台。我可以在coords中的每一对全部使用setInterval()函数执行此操作,但是我如何在5秒钟时刻登录coords[0],在10秒钟登录,等等 - 然后在完成时重新开始?将循环与setInterval()相结合

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); 

回答

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

setInterval(listCoords,5000); 

只要保持存储旁边的显示位置的全局变量。如果函数被调用,则显示该值,增加i并防止它跳出数组边界。这是这样的:

想象的3数组长度,ITLL做

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

或者用一些伪递归和超时:

;/*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

一个如何可以理解'I = ++%coords.length操作? –

0

嵌入函数内的一个setTimeout,调用函数只有在索引小于coords的长度时,这里我们使用立即调用的函数表达式(IIFE)来传入coords和初始值i。 `; -

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

DEMO演示以1秒,而不是5

+0

全球listcoords应该包含什么? (它可能未定义),这与我的答案有什么不同? –

+0

它呢,你只是忘了一个;在阵列后面... –

+0

对不起,我的错误。在这种情况下,您可能需要修改代码以在左括号前添加分号。 – Andy