2011-03-01 44 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