2011-03-01 46 views
1

开始我有一个JavaScript数组是这样的:通过JavaScript阵列每次循环在新的索引

array = [ 
    {"Command": "SetDuration","QuestionId": "2","NewDuration": "1"}, 
    {"Command": "SetDuration","QuestionId": "2","NewDuration": "1"}, 
    {"Command": "SetDuration","QuestionId": "7","NewDuration": "7"}, 
    {"Command": "SetDuration","QuestionId": "6","NewDuration": "7"} 
] 

我的任务是遍历它1次在一分钟内,每次开始增量索引,从而使后3分钟,我会从数组[4] 开始如何实现这一目标? 谢谢!

回答

1

倒闭的魔力:

function createDwindlingLooper(arr) { 
    var n = 0; 
    return function() { 
     for (var i = n; i < arr.length; i++) { 
      console.log(i); // do real stuff here 
     } 
     n += 1; 
    } 
} 

var looper = createDwindlingLooper(array); 

你能满足这个您的计时器要求:

setInterval(createDwindlingLooper(array), 1000 * 60); 

n值将通过一个每次执行looper时间递增,达到预期效果:

var looper = createDwindlingLooper(array); 
looper(); // 0, 1, 2, 3 
looper(); // 1, 2, 3 
looper(); // 2, 3 
looper(); // 3 
looper(); // 
+1

不错的封闭使用 – 2011-03-01 21:46:47

1

当您设置您的计时器时,您可以从另一个函数内部完成,并且该函数可以将索引作为局部变量来维护。

function loopVerySlowly(array) { 
    var index = 0; 
    function doSomething() { 
    // 
    // do something with array[index] ... 
    // 
    index = (index + 1) % array.length; // increment for next time 
    } 

    return setInterval(doSomething, 1000 * 60); 
} 

var interval = loopVerySlowly(array); 
0

这取决于你想如何执行迭代。一种方式是调用settimeout四次以不同的索引以分钟增量运行,例如,

for (var i=0 ; i<4 ; i++) 
    settimeout(function(i){ return function(){ 
     // process here using i as index 
    }, 60000*i); 
0
var checkme = { 
    init: function(start) { 
     for (var i = start; i < array.length; i++) { 
      // alert(array[i].Command + ":" + array[i].QuestionId); 
      //do what you want here 
     }; 
     // start a new loop from current end 
     if (array.length < start) { 
      var t = setTimeout(checkme.init(start+1), 60000);//delay one minute 
     }; 
    } 
}; 
var t = setTimeout(checkme.init(0), 60000);//start first one in 1 minute 

了一点更多的乐趣,用你的“NewDuration”当前(第一)数组元素在每个记录,以便您可以通过数据:)

你问不是改变时间延迟量确切地说,但为什么不呢!

var checkme = { 
    init: function(start) { 
     for (var i = start; i < array.length; i++) { 
      // alert(array[i].Command + ":" + array[i].QuestionId); 
      //do what you want here 
     }; 
     // start a new loop from current end 
     var timedelay = array[start].NewDuration * 60000; 
     // delay by NewDuration # minutes 
     if (array.length < start) { 
      var t = setTimeout(checkme.init(start+1), timedelay); 
     }; 
    } 
}; 
var t = setTimeout(checkme.init(0), 60000);//start first one in 1 minute 
+0

注意:在使用的setTimeout,而不是setInterval的允许被占“处理”的时间,所以只启动一个间隔(分钟在这种情况下),前一个结束之后。 – 2011-03-01 21:45:38