2012-12-07 31 views
5

我需要暫停一個for循環,並不會繼續,直到我指定。對於我正在循環的數組中的每個項目,我運行一些代碼以在單獨的設備上運行操作,並且需要等到該操作完成後才循環到數組中的下一個項目。不要繼續JavaScript for循環直到指定

幸運的是,該代碼/操作是一個遊標,並具有after:部分。

但是,它一直在運行整個for循環,這是我需要防止的。有什麼方法可以防止循環繼續,直到指定?或者也許是一種不同類型的循環或我應該使用的東西?

我的第一個想法是在連續運行的for循環中創建一個while循環,直到光標的after:部分設置爲booleantrue。這只是鎖定了瀏覽器:(正如我擔心它會。

什麼我能做什麼?我是相當新的JavaScript。我已經受夠了享受我的當前項目。

這裏是while-loop嘗試。我知道它會立即運行整個循環,因爲dataCounter13變(兩個項目目前在陣列中)瞬間:

if(years.length>0){ 
    var dataCounter = 1; 
    var continueLoop; 
    for(var i=0;i<years.length;i++){ 
    continueLoop = false; 
    baja.Ord.make(historyName+"?period=timeRange;start="+years[i][1].encodeToString()+";end="+years[i][2].encodeToString()+"|bql:select timestamp, sum|bql:historyFunc:HistoryRollup.rollup(history:RollupInterval 'hourly')").get(
     { 
      ok: function (result) { 
      // Iterate through all of the Columns 

      baja.iterate(result.getColumns(), function (c) { 
      baja.outln("Column display name: " + c.getDisplayName()); 
      }); 
     }, 
     cursor: { 
      before: function() { 
      baja.outln("Called just before iterating through the Cursor"); 
      counter=0; 
      data[dataCounter] = []; 
      baja.outln("just made data["+dataCounter+"]"); 
     }, 
     after: function() { 
      baja.outln("Called just after iterating through the Cursor"); 
      continueLoop = true; 
     }, 
     each: function() { 

      if(counter>=data[0].length) { 
      var dateA = data[dataCounter][counter-1][0]; 
      dateA += 3600000; 
      } 
      else { 
      var dateA = data[0][counter][0]; 
      } 

      var value=this.get("sum").encodeToString(); 
      var valueNumber=Number(value); 

      data[dataCounter][counter] = [dateA,valueNumber]; 
      counter++; 
     }, 
     limit: 744, // Specify optional limit on the number of records (defaults to 10)2147483647 
     offset: 0 // Specify optional record offset (defaults to 0) 
     } 
     }) 
     while(continueLoop = false){ 
      var test = 1; 
      baja.outln("halp"); 
     } 
    dataCounter++; 
    } 
} 
+2

發佈一些代碼,您都試過了。如果你有實際的代碼顯示你已經完成了什麼以及爲什麼它不工作,人們會更願意提供幫助。 –

+0

因此,for-loop的主體應該是一個異步任務? – Bergi

回答

5

不要每個元素使用for循環來循環您需要在。 after:來記住你的數組中的哪一個元素剛剛完成,然後移動到下一個。

事情是這樣的:

var myArray = [1, 2, 3, 4] 

function handleElem(index) { 
    module.sendCommand({ 
     ..., // whatever the options are for your module 
     after: function() { 
      if(index+1 == myArray.length) { 
       return false; // no more elem in the array 
      } else { 
       handleElem(index+1)} // the after section 
      } 
    }); 
} 

handleElem(0); 

我假定你調用一個函數的一些選項(比如你會爲$.ajax()),而after()部分是叫你過程結束函數(如success()對於$.ajax()

如果「模塊」你打電話是不是在after()回調正確地結束,你可以使用setTimeout()啓動過程的下一個元件上的延遲

編輯:有了您的真正的代碼會是這樣的:

function handleElem(index) { 
    baja.Ord.make("...start="+years[index][1].encodeToString()+ "...").get(
    { 
     ok: ... 
     after: function() { 
      if(index+1 == years.length) { 
       return false; // no more elem in the array 
      } else { 
       handleElem(index+1)} // the after section 
      } 
     } 
    }); 
} 
+0

謝謝!這正是我所期待的!我知道必須有比for循環更理想的東西。不知道爲什麼我想不出你的解決方案。再次感謝您的幫助(我現在應該做的任何事情是什麼?; _;)編輯:等待2分鐘,然後打開接受答案,得到它:D – addMitt